node js app.use 抛出一个中间件函数

Posted

技术标签:

【中文标题】node js app.use 抛出一个中间件函数【英文标题】:node js app.use throws a middleware functions 【发布时间】:2020-11-01 08:18:06 【问题描述】:

我是 node.js 的新手,我正在关注博客并练习如何创建新博客

https://vegibit.com/node-js-blog-tutorial/

直到这一步一切正常“Edge Template Engine With Express”,一旦我添加了以下几行

app.use(expressEdge);
app.set('views', __dirname + '/views');

我收到以下错误。

C:\Automation\NodeJS_Projects-master\nodejs-blog-tutorial\node_modules\express\lib\application.js:210 throw new TypeError('app.use() 需要一个中间件函数') ^

TypeError: app.use() 需要一个中间件函数 在 Function.use (C:\Automation\NodeJS_Projects-master\nodejs-blog-tutorial\node_modules\express\lib\application.js:210:11) 在对象。 (C:\Automation\NodeJS_Projects-master\nodejs-blog-tutorial\index.js:8:5) 在 Module._compile (internal/modules/cjs/loader.js:1138:30) 在 Object.Module._extensions..js (internal/modules/cjs/loader.js:1158:10) 在 Module.load (internal/modules/cjs/loader.js:986:32) 在 Function.Module._load (internal/modules/cjs/loader.js:879:14) 在 Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12) 在 internal/main/run_main_module.js:17:47

完整代码尝试远

    const express = require('express');
    var slash = require("slash");
    const expressEdge = require('express-edge');
    const app = new express();
    var dirname = __dirname;
    if (process.platform === 'win32') dirname = slash(dirname);
    app.use(express.static('public'));
    app.use(expressEdge);
    app.set('views', dirname + '/views');
    
    mongoose.connect('mongodb://localhost:27017/node-blog',  useNewUrlParser: true )
        .then(() => 'You are now connected to Mongo!')
        .catch(err => console.error('Something went wrong', err))
        
    app.get('/posts/new', (req, res) => 
        res.render('create')
    );
     
    app.get('/', (req, res) => 
        res.render('index');
    );
    
    app.get('/about', (req, res) => 
        global.__base = dirname + '/pages/about.html';
        console.log(global.__base)
        res.sendFile(global.__base);
    );
    
    app.get('/contact', (req, res) => 
        global.__base = dirname + '/pages/contact.html';
        res.sendFile(global.__base);
    );
     
    app.get('/post', (req, res) => 
        global.__base = dirname + '/pages/post.html';
        res.sendFile(global.__base);
    );
    
    app.listen(4000, () => 
        console.log('App listening on port 4000')
    );

【问题讨论】:

我在windows环境下尝试上面的代码 错误信息是什么? C:\Automation\NodeJS_Projects-master\nodejs-blog-tutorial\node_modules\express\lib\application.js:210 throw new TypeError('app.use() requires a middleware function') ^ TypeError: app.use() 需要一个中间件函数在 Function.use (C:\Automation\NodeJS_Projects-master\nodejs-blog-tutorial\node_modules\express\lib\application.js:210:11) 在 Object. (C:\Automation\NodeJS_Projects-master\nodejs-blog-tutorial\index.js:8:5) 在 Module._compile (internal/modules/cjs/loader.js:1138:30) "name": "nodejs-blog-tutorial", "version": "1.0.0", "description": "使用 node.js 创建博客", "main": " index.js", "scripts": "test": "echo \"Error: no test specified\" && exit 1" , "keywords": [ "blog" ], "author": "", "license ": "ISC", "依赖项": "express": "^4.17.1", "express-edge": "^2.0.2", "mongoose": "^5.9.23", "nodemon": “^2.0.4”、“斜杠”:“^3.0.0”、“startbootstrap-clean-blog”:“^5.0.9” 【参考方案1】:

本教程可能已经过时,因为他们似乎使用了旧版本的express-edge,因为您应该按如下方式设置express-edge(有关详细信息,请参阅https://github.com/ecrmnn/express-edge#usage):

const  engine  = require('express-edge');
...
app.use(engine); // instead of app.use(expressEdge);

您也可以这样做:

const expressEdge = require('express-edge');
...
app.use(expressEdge.engine);

如果您查看source,您可以看到该模块导出了一个对象(包含configengine)并且没有中间件,因此出现了错误。

【讨论】:

非常感谢您指出正确的错误并指出解决方案 乐于帮助 :) 如果解决了问题,请采纳答案,谢谢。 @MageshBalasubramaniam 或者,您可以修改现有代码并执行app.use(expressEdge.engine)

以上是关于node js app.use 抛出一个中间件函数的主要内容,如果未能解决你的问题,请参考以下文章

node.js之express中app.use

node js 中间件以及mysql模块

Node.js 表达了对 bodyParser 中间件的正确使用

Node.js 表达了对 bodyParser 中间件的正确使用

错误:TypeError('app.use()需要中间件函数

node.js中 koa 框架的基本使用方法