Node.js 为什么页面处理程序中未设置request.app?

Node.js 为什么页面处理程序中未设置request.app?,node.js,express,request,Node.js,Express,Request,我只是想用nodejs和express构建一些CRUD应用程序。要删除应该保存数据的数据库,我只需在应用程序级别创建一个数组。然后我想在不同页面的处理程序中访问这个数组 现在的问题是,在调用处理程序时没有设置请求对象的属性app 下面是我使用的代码: var express = require("express"); var morgan = require("morgan"); var app = express(); app.use(morgan("tiny")); app.loca

我只是想用nodejs和express构建一些CRUD应用程序。要删除应该保存数据的数据库,我只需在应用程序级别创建一个数组。然后我想在不同页面的处理程序中访问这个数组

现在的问题是,在调用处理程序时没有设置请求对象的属性app

下面是我使用的代码:

var express = require("express");
var morgan = require("morgan");

var app =  express();

app.use(morgan("tiny"));

app.locals.dataStore = [{test: "bla"}];

app.get('/', (req, res) => {
    res.json({
        message: 'Behold The MEVN Stack!'
    });
});

app.get('/data', (req, res) => {
    console.log("request.app = " + JSON.stringify(req.app));    
    res.json("get data");
});

app.post('/data', (req, res) => {
    console.log(req.body);
    res.json("create data");
});

const port = process.env.PORT || 4000;
app.listen(port, () => {
    console.log(`listening on ${port}`);
});
运行此代码并从浏览器调用该页面将生成此输出

listening on 4000
request.app = undefined
GET /data 200 10 - 8.572 ms
以下是有关我的系统的更多信息:

OS: Win10 64
Node: v12.13.0
Express: 4.17.1
因为我没有发现关于这个问题的其他问题,所以我认为我做错了什么。任何解决这个问题的暗示都会得到

非常感谢

问候 格雷戈

更新:

我听从亚历克西斯的建议,修改了密码。然而,它不起作用

新代码如下:

/// index.js
var express = require("express");
var morgan = require("morgan");

var app =  express();

app.use(morgan("tiny"));

app.locals.dataStore = [{test: "bla"}];

app.get('/', (req, res) => {
    res.json({
        message: 'Behold The MEVN Stack!'
    });
});

app.get('/data', (req, res) => {
    console.log("request.app = " + JSON.stringify(req.app));    
    res.json("get data");
});

app.get('/test', require("./test.js"));

const port = process.env.PORT || 4000;
app.listen(port, () => {
    console.log(`listening on ${port}`);
}); 

/// test.js
module.exports = function (req, res) {
    console.log("test.request.app = " + JSON.stringify(req.app));    
    res.send("get test");
  }
以及在我的浏览器中调用相应URL后的输出:

listening on 4000
test.request.app = undefined
GET /test 200 8 - 4.707 ms
GET /favicon.ico 404 150 - 1.358 ms
request.app = undefined
GET /data 304 - - 0.678 ms

为了访问
.app
,您必须创建一个模块,该模块只导出一个中间件函数,并在主文件中要求()它,如下所示:

// index.js
app.get('/data', require('./mymiddleware.js'))

// mymiddleware.js
module.exports = function (req, res) {
  console.log("request.app = " + JSON.stringify(req.app));    
  res.json("get data");
}

是Express的官方文档吗?问题已经解决了,因为我可以使用正确/完整的属性路径“req.app.locals.dataStore”以两种方式访问全局数组

但问题仍然是:

为什么req.app在传递给JSON.stringify时显示为未定义

任何关于原因的提示都将不胜感激

非常感谢

问候
Gregor

好的,但是创建和需要模块与只向app.get传递函数之间的真正区别是什么?我不确定,实际上,官方文档没有提到这方面的内容,所以我想这就是他们设计的API。就我所知,需要模块的过程,导出只是声明模块功能的定义格式。如果export设置为function,则require返回一个函数。或者还有其他的魔法吗?这是完全正确的,我真的不知道这是如何工作的,正如我之前所说的,我所知道的是,为了完成代码,你应该遵循这个模式。嗯。。。今天下午晚些时候我会按照你建议的方式来尝试,尽管我不明白这两种方式的区别。有点不满意,但非常感谢您的努力。