尝试将中间件功能导出到module.exports对象时,为什么会显示“下一个不是功能”?

时间:2019-03-15 15:26:38

标签: javascript node.js express

我在logger.js模块中编写了一个中间件函数,然后将其导入app.js中并使用

// ------ File : logger.js ------ //

function log(req, res, next) {
  console.log('Logging details ... ');
  next();
}

module.exports = log;

// ------ File : app.js -------- //

const logger = require('./logger');

app.use(logger);

上面的代码可以正常工作,我的日志功能也可以工作。但是,如果我以以下方式导出此日志功能(将其添加到module.exports对象中),则会收到错误

// ------ File : logger.js -------//

function log(req, res, next) {
  console.log('Logging details ... ');
  next();
}
module.exports.log = log;

// ------ File : app.js -------- //

const logger = require('./logger');

app.use(logger.log());

Logging details ...
D:\express-demo-worked\logger.js:4
    next();
    ^

TypeError: next is not a function
    at Object.log (D:\express-demo-worked\logger.js:4:5)
    at Object.<anonymous> (D:\express-demo-worked\app.js:18:16)
    at Module._compile (internal/modules/cjs/loader.js:738:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:749:10)
    at Module.load (internal/modules/cjs/loader.js:630:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:570:12)
    at Function.Module._load (internal/modules/cjs/loader.js:562:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:801:12)
    at internal/main/run_main_module.js:21:11
[nodemon] app crashed - waiting for file changes before starting...

有人可以向我解释为什么这种行为会有所不同,以及如何纠正我在此处添加的第二个代码段吗?

2 个答案:

答案 0 :(得分:3)

app.use(logger.log());

这将立即调用logger.log,不传入任何参数。不管logger.log返回什么,都将传递到app.use中。由于您未传入任何参数,因此next是未定义的,从而导致该异常。

相反,请执行以下操作:

app.use(logger.log);

这会将logger.log传递给app.use。稍后,将调用logger.log,并传递正确的参数。

答案 1 :(得分:2)

这里:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
     <widget class="QTabWidget" name="tabWidget">
      <widget class="QWidget" name="tab">
       <attribute name="title">
        <string>Tab 1</string>
       </attribute>
       <layout class="QVBoxLayout" name="verticalLayout_2">
        <item>
         <widget class="QListWidget" name="listWidget"/>
        </item>
        <item>
         <widget class="QPushButton" name="pushButton">
          <property name="text">
           <string>PushButton</string>
          </property>
         </widget>
        </item>
       </layout>
      </widget>
      <widget class="QWidget" name="tab_2">
       <attribute name="title">
        <string>Tab 2</string>
       </attribute>
      </widget>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>30</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

调用 app.use(logger.log()); ,不带任何参数,并将其返回值传递到log中。由于app.use期望并使用其参数,因此在log上将失败,因为next()参数的值为next,因为您没有为其传递参数。

您可能只是想将函数传递给:

undefined