javascript - 快速会话:“会话和部分”类型上不存在属性“登录”'。(2339)
问题描述
我得到以下错误代码: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 并且没有在类型singin
下定义属性。req.session
Session & Partial<SessionData>
为了实现这一点,您可以利用Declaration Merging,checkoutdefiniteTyped /types/express-session/index.d.ts。在您的情况下,只需创建一个文件src/types/index.d.ts
并附上以下内容:
export {};
declare module 'express-session' {
interface SessionData {
singin: boolean
}
}
推荐阅读
- php - 如何将多行从文本区域插入到多列?
- android - 可空接收器类型捆绑的不安全使用?android 应用程序将在编译时出现警告但立即崩溃
- linux - 为什么这些挂载的不同目录具有相同的 inode 号?
- android - 是来自意图的非空对象吗? .extras?可以为空?
- c - 在函数中分配结构的 char** 成员
- dataframe - 使用列表并替换 pyspark 列
- javascript - 有没有办法使用谷歌应用脚本在文档中附加左缩进的文本?
- python - 如何在每一行中找到包含列表的熊猫数据框列的标准偏差?
- javascript - 用于识别 HTML 标记的 Regx 已启动但未关闭
- php - php sha256 今天(2019 年 5 月)安全吗?