javascript - 从.use(req,res)更改为使用routes.js文件时,express应用程序出现错误

标签 javascript node.js express typeerror

我有一个 Express 站点,正在尝试将其转换为使用 paths.js 文件来清理内容。我收到一个类型错误,解释如下。我已阅读thisthis但我还是不明白。目前该网站使用以下几行:

const server = express()
    .set('view engine', 'ejs') // set up ejs for templating
    .use(flash()) // use connect-flash for flash messages stored in session
  .use((req, res) => res.render('../views/pages/indextimewithall.ejs', {stockSearched :"X",
                     activeStocks: [],
                    addingError:false}) )
  .listen(port);


const wss = new SocketServer({ server });

wss.on('connection', (ws) => {
  console.log('Client connected');
  ws.on('close', () => console.log('Client disconnected'));
});

setInterval(() => {
  wss.clients.forEach((client) => {
    client.send(new Date().toTimeString());
  });
}, 1000);

但是当我将其更改为:

const server = express()

.set('view engine', 'ejs') // set up ejs for templating
        .use(flash()) // use connect-flash for flash messages stored in session
      .listen(port);
    require('./app/routes.js')(server); 

    const wss = new SocketServer({ server });

    wss.on('connection', (ws) => {
      console.log('Client connected');
      ws.on('close', () => console.log('Client disconnected'));
    });

    setInterval(() => {
      wss.clients.forEach((client) => {
        client.send(new Date().toTimeString());
      });
    }, 1000);

..我收到 TypeError: app.get is not a function

以下是routes.js文件的内容:

// app/routes.js
module.exports = function(app) {
    app.get('/', function(req, res) {
        var myStocks = require('./models/myStock'); 
        var showStocks = function(err, data){
            res.render('pages/indextimewithall.ejs', {
                     stockSearched :"X",
                    activeStocks: [],
                    addingError:false
                });
        }
        myStocks.find({isActive:true}).exec(showStocks);
    });
};

感谢您的任何建议。

最佳答案

你的清理工作很好(尽管可读性和可维护性是一个大问题......)。这是给您的一个大问题:

app.listen 方法不可链接,但 app.useapp.METHOD 系列可以。这意味着该方法最终不会返回自身。因此,您将得到 app.get is undefined,因为您的 server 变量不是一个 Express 实例。

你应该做的是打破链条,并定义如下:

const app = express();
app.set('view engine', 'ejs');     // set up ejs for templating
app.use(flash());                  // use connect-flash for flash messages stored in session
require('./app/routes.js')(app);   // not recommended to clean up like this way though
app.listen(port);


const wss = new SocketServer({ server: app });
wss.on('connection', (ws) => {
  console.log('Client connected');
  ws.on('close', () => console.log('Client disconnected'));
});


setInterval(() => {
  wss.clients.forEach((client) => {
    client.send(new Date().toTimeString());
  });
}, 1000);

请注意,在上面,我将变量 server 重命名为 app。只是为了遵循惯例。

您可以通过运行如下命令来了解某个方法是否可链接:

const app = express();
console.log(app === app.use((req, res, next) => next)));  // true
console.log(app === app.listen(3000));  // false

关于javascript - 从.use(req,res)更改为使用routes.js文件时,express应用程序出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50030287/

相关文章:

javascript - d3 对其他需要文件中的节点哈希更改没有反应

javascript - 如何修复错误 "Error "npm WARN 已过时 json3@3.3.2 : please use your own JSON object instead of JSON 3"

node.js - 如何使用 mongoose 在 mongodb 中搜索具有动态字段的数据?

angularjs - 客户端和服务器端身份验证有什么区别?

javascript - 如何验证一组复选框并返回错误消息javascript

javascript - 5 个选择框,隐藏每个选中项的值

javascript - 如何避免 html5 Canvas 中的文本重叠

javascript - 循环遍历对象并成对打印

node.js - 我怎样才能让 vscode 假设一个 node.js 上下文,这样它就不会假设 `fetch` 存在?

javascript - 尝试从 Node 服务器检索 json 对象时获取 "Cannot GET/"