Node.js controller.js中未定义节点w/Express req.session
我是Node的新手,所以这可能是显而易见的。在我的应用程序的main.js文件中,我有一个带有回调函数的路由,它成功地设置了用户的会话信息(UserID)。基本示例:Node.js controller.js中未定义节点w/Express req.session,node.js,Node.js,我是Node的新手,所以这可能是显而易见的。在我的应用程序的main.js文件中,我有一个带有回调函数的路由,它成功地设置了用户的会话信息(UserID)。基本示例: App.get("/setID", function(req,res){ req.session.UserID = ‘Fred’; res.send(“User ID Set”); }) 这是可行的,但我想练习用路由器和控制器组织代码。当我将代码移动到controller.js时,如下所示: Expo
App.get("/setID", function(req,res){
req.session.UserID = ‘Fred’;
res.send(“User ID Set”);
})
这是可行的,但我想练习用路由器和控制器组织代码。当我将代码移动到controller.js时,如下所示:
Exports.setSessionUserID = function(req,res){
req.session.UserID = ‘Fred’;
res.send(“User ID Set”);
}
我得到一个错误,表明req.session未定义:
TypeError:无法设置未定义的属性“UserID”
如果我注释掉req.session行,我确实成功地获得res.send,因此路由器正确地调用了这个函数
我相信controller.js拥有main.js中所有相关的“requires”(bodyParser、Express sessions)
为什么从控制器调用该函数(关于会话)与从main.js调用该函数有任何不同?这里唯一的问题是,您试图在
req.session
上设置一个属性,而该属性本身是未定义的
,您不能这样做
// you can do
Exports.setSessionUserID = function(req,res){
req.session = { UserId: `Fred` }
res.send(“User ID Set”);
}
一个例子
let req={};
req.session={UserId:`Fred`};
console.log(req.session.UserId)
您的会话中间件在路由器/控制器之前吗?在main.js中,我使用:var session=require(“express sessions”),还使用app.use。我在controller.jsAh-ha中再次执行这些操作!在main.js中,我在调用路由器之前使用app.use(sessions…)!我明天到办公室时会重新安排。谢谢你不应该再这样做控制器。执行app.use()意味着它将在所有控制器之前运行。另外,您是如何将控制器连接到应用程序的?以什么顺序连接的?Main.js对router.js有一个要求和用途。router.js需要controller.js,然后是router.get(“/setSessionUserID”,controller.setSessionUserID)。Module.expotes=路由器。谢谢Suman。我明白你的意思,但在我的函数中,“req”引用了已经有数据/成员的请求对象。Req.params将工作,但Req.session不工作。它在main.js中运行良好,但在控制器中不起作用。他们之间有什么不同?我看到你的修订版了,苏曼,我会试试看。仍然对main.js和controller.js之间的差异感到好奇。再次感谢@Billw93720您正在将req
,res
传递给一个函数,但没有下一个。我认为这是这里唯一的问题。我将尝试添加下一个。也许控制器版本的函数需要它,而main.js不需要。谢谢。@billw_93720修改req
使用中间件