Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js controller.js中未定义节点w/Express req.session_Node.js - Fatal编程技术网

Node.js controller.js中未定义节点w/Express req.session

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

我是Node的新手,所以这可能是显而易见的。在我的应用程序的main.js文件中,我有一个带有回调函数的路由,它成功地设置了用户的会话信息(UserID)。基本示例:

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
使用中间件