gpt4 book ai didi

node.js - 如何在 Node.js 应用程序中创建我自己的功能模块

转载 作者:太空宇宙 更新时间:2023-11-03 22:48:30 25 4
gpt4 key购买 nike

我正在构建具有以下结构的 Node.js 应用程序:

  • 服务器.js
  • Controller /user.js

server.js 需要 user.js Controller :

require('./controllers/user.js').route(app, mongoose);

controller/user.js 文件如下:

function route(app, mongoose){
function route(app, mongoose){

// Create new User item
app.post('/user/create', function(req, res){
...
}

// Edit user
app.put('/user/:id/edit', function(req, res){
...
}

...
}
module.exports.route = route;

这工作正常。例如,我知道想要在编辑用户功能中使用中间件,因此它看起来像:

...
app.put('/user/:id/edit', loadUser, function(req, res){
...

如果我在这条线上方定义 loadUser 函数,它就可以正常工作。当我在文件“./lib/middleware.js”中添加所有中间件功能时,以及当我尝试使用以下命令在 user.js 中加载该文件时:

require('../lib/middleware.js').create(); // Create is the exported function

这不起作用,我收到错误消息,指出 loadUser 是一个未知函数。

有什么想法吗?

** 更新 **

我已经更新了文件,在 server.js (主文件)中我有:

...
var middleware = require('./lib/middleware.js');
...
require('./controllers/user.js').route(app, mongoose, middleware);
...

在 middleware.js 中,我有:

function create() {
function loadUser(req, res, next) {
// You would fetch your user from the db
var user = users[req.params.id];
if (user) {
req.user = user;
next();
} else {
next(new Error('Failed to load user ' + req.params.id));
}
}
return module;
}

在controllers/user.js中我有

function route(app, mongoose, middleware){
...
// Modify an user
app.put('/user/edit', middleware.loadUser, function(req, res){
...
}
...
}

当我运行应用程序(node server.js)时,出现以下错误:

Error: PUT route /user/edit requires a callback

我不确定在 middleware.js 中返回正确的内容,还不太熟悉模块内容。我还尝试了“module.exports.create = create;”但同样的事情。

再次尝试更新

如果我为该函数创建一个模块会怎样?在 ./lib/middleware.js 中我会:

(function(){
var middleware = {};
middleware.loadUser = function () {
console.log("loadUser");
}
return middleware;
}());

在服务器中,我称之为:

var middleware = require('./lib/middleware.js');
middleware.loadUser;

在我看来应该有效,但事实并非如此......

最佳答案

文件中的“全局”范围实际上是模块范围。只需在不同的文件中创建一个函数,它就会在原始文件的范围内。

你想做的是

// routes.js
var middleware = require("../lib/middleware.js").create();

app.put('/user/:id/edit', middelware["loadUser"], function(req, res){

您会发现全局变量实际上写入其作用域内的module

那么您的 function loadUser() { ... } 应该存在于 module 属性中。

// middleware.js
function create() {
...

return module;
}

如果您从创建函数返回module,则返回全局范围。

[编辑]

function create() {
function loadUser(req, res, next) {
// You would fetch your user from the db
var user = users[req.params.id];
if (user) {
req.user = user;
next();
} else {
next(new Error('Failed to load user ' + req.params.id));
}
}
return module;
}

您需要添加 module.loadUser = loadUser 或在模块范围内定义 loadUser。 IE。在 create 函数之外。

[进一步编辑]:

标准设置类似于:

// middleware.js
(function() {

function loadUser(...) {
...
}

...

module.exports.loadUser = loadUser;

})();

//otherfile.js
var middle = require("middleware");
middle.loadUser();

关于node.js - 如何在 Node.js 应用程序中创建我自己的功能模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5656436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com