加载模块并将其作为中间件公开时运行代码

时间:2018-04-07 02:08:26

标签: javascript node.js express

我仍然试图完全理解导出和导入模块在Nodejs中的工作原理。

我正在使用以下文件来播种mongodb数据库。当我作为独立文件执行它时,此文件完全按预期运行并返回我期望的结果。我的问题是我想在我的应用程序中的两个不同位置使用此文件。所以我试图使它成为可导出/可导入的模块。这是我尝试过的:

seed.js看起来像这样:

'use strict';

//  library modules

const {ObjectID} = require('mongodb');

const seeder     = require('mongoose-seed');

const jwt        = require('jsonwebtoken');

const util       = require('util');

//  local modules

const {Course}   = require('./../models/course');

const {Review}   = require('./../models/review');

const {User}     = require('./../models/user');

const {data}     = require('./../data/data.js');

const config     = require('./../config/config.js');

/*==================================================

    build seeding Courses, Reviews, Users
==================================================*/

// Connect to MongoDB via Mongoose

let seed = seeder.connect(process.env.MONGODB_URI, (e) => {
    console.log(`Connected to: ${process.env.MONGODB_URI} and seeding files`);

    // Load Mongoose models
    seeder.loadModels([
        'src/models/user.js',
        'src/models/review.js',
        'src/models/course.js'
    ]);

    // Clear specified collections
    seeder.clearModels(['User', 'Review', 'Course'], function() {

        // Callback to populate DB once collections have been cleared
            seeder.populateModels(data, function() {
            seeder.disconnect();
        });

    });
});

module.exports = seed;

在app.js中我有这两行

const seed         = require('./middleware/seed');

app.use(seed);

我也尝试了,但无济于事

app.use(seed());

缺少什么?我不想在两个不同的地方内联使用代码(你知道吗)。

失败了这个错误:

throw new TypeError('app.use() requires a middleware function')

我很抱歉格式化我认为我正在使用markdown,但我显然不是。

2 个答案:

答案 0 :(得分:0)

我允许自己在不同实例中访问变量的一种方法是将其添加到流程变量中。在node.js中,无论项目在哪里,它都将始终如一。在某些情况下,我会做process.DB = seed();,这将允许process.DB始终是结果。因此,在主类中,您可以执行process.DB = seed();,并且运行该主类的所有其他类都可以访问process.DB,从而使您的数据库随时可用。

答案 1 :(得分:0)

您正在该模块中执行播种器功能,而根本不返回任何中间件功能。中间件始终是一个功能,它具有以下形式:

const seed = function (req, res, next) {
  ...
  next()
}

根据您现在所拥有的,您可以做的最好的事情是以下内容,当模块加载时,它们肯定会为您的模型播种。

const seed  = require('./middleware/seed');

您是否尝试在每次请求时将这两个功能作为中间件运行?在这种情况下,你可以这样做:

const seed = function (req, res, next) {
    seeder.connect(..., (e) => {
       ...
       seeder.clearModels(..., ()=>{
          ...
          next()
       })
    })
})

如果要在模块级别运行该播种器代码并将其作为中间件公开,则将当前模块级代码包装在函数中并在模块加载时执行它。请注意,如果新函数接收到它,则可选择处理下一个回调。

function doSeed(next){
   //your code currently running at module level
   if(next)
       return next()
}
 doSeed();  //run the code at the module level
 const seed =  (req, res, next) => doSeed(next))
 module.exports = seed;