Express会话:“会话&会话"类型上不存在“登录"属性部分< SessionData>".(2339) [英] Express Session: Property 'signin' does not exist on type 'Session & Partial<SessionData>'. (2339)
本文介绍了Express会话:“会话&会话"类型上不存在“登录"属性部分< SessionData>".(2339)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我收到以下错误代码:类型会话&部分< SessionData>".(2339)
I got following Error Code: Property 'signin' does not exist on type 'Session & Partial<SessionData>'. (2339)
src/index.ts
import "reflect-metadata";
import express = require("express");
import { Request, Response, NextFunction } from "express"
import http = require("http");
import * as bodyParser from "body-parser";
import * as cookieParser from "cookie-parser";
import * as session from "express-session";
var debug = require('debug')('rkdemo:server');
// configure App
const app = express();
var port = normalizePort(process.env.PORT || '3000');
var server = http.createServer(app);
app.set('port', port);
app.use(bodyParser.json({ limit: '50mb' }));
app.use(bodyParser.urlencoded({ limit: '50mb', extended: false }));
app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(session({ secret: 'krunal', resave: false, saveUninitialized: true, }));
app.all("/", function (req, res) {
res.status(200).send("Hello World")
});
app.get("/signin", (req, res) => {
req.session.signin = true
res.send("Login complete")
})
app.get("/signout", (req, res) => {
req.session.destroy((err)=>{
if (err){
res.status(500).send(err)
}else{
res.send("Session destroyed")
}
})
})
app.get("/secret", (req, res) => {
if(req.session.signin){
res.send("You are in Ford Knox")
}else{
res.status(401).send('You have to stay outside')
}
})
server.listen(port, function () {
console.log('Example app listening on port: ' + port);
});
server.on('error', onError);
server.on('listening', onListening);
function normalizePort(val) {
var port = parseInt(val, 10);
if (isNaN(port)) {
return val;
}
if (port >= 0) {
return port;
}
return false;
}
/**
* Event listener for HTTP server "error" event.
*/
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
var bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port;
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}
/**
* Event listener for HTTP server "listening" event.
*/
function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}
我的配置
package.json
{
"name": "session_test",
"version": "0.0.1",
"description": "Awesome project developed with TypeORM.",
"devDependencies": {
"@types/node": "^8.0.29",
"ts-node": "3.3.0",
"typescript": "3.3.3333"
},
"dependencies": {
"@types/express": "^4.17.9",
"@types/express-session": "^1.17.3",
"bcrypt": "^5.0.0",
"body-parser": "^1.19.0",
"cookie-parser": "^1.4.5",
"express": "^4.17.1",
"express-fileupload": "^1.2.0",
"express-session": "^1.17.1",
"http": "0.0.1-security",
"jsonwebtoken": "^8.5.1",
"mysql": "^2.14.1",
"reflect-metadata": "^0.1.10",
"request": "^2.88.2",
"shortid": "^2.2.16",
"typeorm": "0.2.29",
"validator": "^13.5.1",
"validatorjs": "^3.21.0"
},
"scripts": {
"start": "ts-node src/index.ts"
}
}
tsconfig.json
{
"compilerOptions": {
"lib": [
"es5",
"es6"
],
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"outDir": "./build",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"sourceMap": true
}
}
我怎么了?
推荐答案
这仅仅是因为您使用的是TS,而在 req.session
下未定义属性 singin
,类型为 Session&部分< SessionData>
.
It's simply because you are using TS and propterty singin
isn't defined under req.session
, which is of type Session & Partial<SessionData>
.
To achieve that, you can take advantage of Declaration Merging, checkout DefinitelyTyped/types/express-session/index.d.ts. In your case just create a file src/types/index.d.ts
and attach the the following:
export {};
declare module 'express-session' {
interface SessionData {
singin: boolean
}
}
这篇关于Express会话:“会话&会话"类型上不存在“登录"属性部分< SessionData>".(2339)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文