我正在开发Web服务器,并尝试进行上传文件路由。但我只需要登录的人才能上传文件。因此,我添加了中间件来检查会话数据是否可用。但是,在此路由中始终没有定义会话数据。
我试图重新加载并重新生成会话,但它仍未定义。我将库从“ multer”更改为“ express-fileupload”,但没有效果。可能是因为内容的类型是multipart-form-data。我不确定。
会话中间件设置。
const sessionMidleware = session({
secret: 'My secret key',
resave: false,
saveUninitialized: false,
})
app.use(sessionMidleware)
我插入的用于调试的中间件。
app.post(
'/sendinvoice',
(req, res, next) => {
console.log(req.session)
next()
},
uploadCustomerInvoice().fields([
{ name: 'file', maxCount: 1 },
{ name: 'course_id', maxCount: 1 },
]),
customerInvoice,
)
这是我在登录和注册时用于在其他路由中建立会话的功能。
module.exports = (req, profile, courses) => {
req.session.profile = profile
req.session.courses = courses
req.session.isSuper = false
req.session.isAdmin = false
req.session.save()
}
我希望req.session.profile的输出为存储用户数据的对象,但实际输出未定义。
答案 0 :(得分:0)
使用multer时,会话会被覆盖,这也会在cls软件包中发生。
在调用multer实例时尝试添加Promise,并在解决后继续执行下一行。我认为这应该可以解决问题。
答案 1 :(得分:0)
您需要在一种途径中SET
使用会话密钥才能在另一种途径中使用它。例如登录。
所以在您的情况下,
app.post('/login', (req,res) =>{
//here check if logged in
if(login){
// Set the session
req.session.someKey = someDataToVerifyUser;
}
})
app.post('/upload', (req,res,next)=>{
if(req.session.someKey && someVerification(req.session.someKey)){
next();
}else{
res.status(400).send('Not Authorized')
}
}, ..multer..., (req,res)=> {...})
编辑:
您可以使用passport-js
使注册和登录过程变得无缝。
EDIT2: 我举了一个最小的例子,看看是否有帮助:
const express = require('express');
const app = express();
var router = express.Router()
const session = require('express-session');
var multer = require('multer')
var upload = multer({ dest: './uploads/' })
var sess = {
secret: 'mySecret',
cookie: { token: null },
saveUninitialized: false,
resave: true
};
app.use(session(sess));
app.get('/', async (req, res) => {
console.log("Hit The GET /:")
req.session.token = 'hello';
console.log("Setting the session:"+req.session.token+"\n"); // Outputs 'hello'
res.send(req.session.token);
});
app.get('/me', async (req, res) => {
console.log("Hit The GET /me:")
console.log(`Printing the Session: ${req.session.token}\n`);
res.send(req.session.token);
});
app.post('/', (req, res, next) => {
console.log("Hit The POST /me:")
console.log(`THERE IT IS ${req.session.token}\n`);
next()
},
upload.single('avatar'),
function (req, res, next) {
console.dir(req.file);
res.json(req.file)
})
app.listen(8888, () => {
console.log('Server Running At: 8888');
})
这是控制台输出:
Server Running At: 8888
Hit The GET /:
Setting the session:hello
Hit The GET /me:
Printing the Session: hello
Hit The POST /me:
THERE IT IS hello
{ fieldname: 'avatar',
originalname: '304.png',
encoding: '7bit',
mimetype: 'image/png',
destination: './uploads/',
filename: '340cae7033576062253339d04519ed8a',
path: 'uploads/340cae7033576062253339d04519ed8a',
size: 4093 }
答案 2 :(得分:0)
我终于发现会话消失了,因为我忘记了随请求一起发送cookie。我正在使用Fetch API。因此,我将credentials: 'include'
添加到标题中,然后它开始工作。谢谢。