首页 > 解决方案 > 快速会话:“会话和部分”类型上不存在属性“登录”'。(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
    }
 }

我有什么错?

标签: javascriptnode.jstypescriptexpressexpress-session

解决方案


这只是因为您使用的是 TS 并且没有在类型singin下定义属性。req.sessionSession & 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
    }
}


推荐阅读