在make-runnable-output之后在服务器控制台上未定义

时间:2017-11-20 10:45:24

标签: node.js express

我在nodejs上创建了一个简单的html应用程序。这是代码os server.ts

import express = require('express');
import http = require('http');

import path = require('path');
import cookieParser = require('cookie-parser');

export class Server {
    static startServer() {
        let app = express();
        app.use(cookieParser());
        app.use(express.static(__dirname + "/public"));

        let server = http.createServer(app);
        server.listen(7000, () => {
            console.log('Up and running on port : ' + 7000);
        });
    }
}
exports.startServer = Server.startServer;

// Call a module's exported functions directly from the command line.
require('make-runnable');

我使用make-runnable模块直接从命令行运行导出的函数。这是 package.json

中的start脚本
"start": "concurrently \"tsc --watch \" \"nodemon server.js startServer\""

应用程序工作正常,但这是在屏幕上打印未定义的烦人,这应该解决。

[1] [nodemon] restarting due to changes...
[1] [nodemon] starting `node server.js startServer`
[1] Up and running on port : 7000
[1] --------make-runnable-output--------
[1] undefined
[1] ------------------------------------
[0] 4:08:52 PM - Compilation complete. Watching for file changes.

这是什么原因?

1 个答案:

答案 0 :(得分:0)

解决方案

make-runnable包使您能够通过导入“ custom”模块并为printOutputFrame指定布尔值来清除输出帧。而不是require('make-runnable'),请使用:

require('make-runnable/custom')({
  printOutputFrame: false
})

但是,这不会删除“未定义”(或输出)消息,因为make-runnable期望在解决承诺时记录一些返回值。

相反,请从函数中返回一些值以供Bluebird(或可运行的)自行打印:

static startServer() {
        let app = express();
        app.use(cookieParser());
        app.use(express.static(__dirname + "/public"));

        let server = http.createServer(app);
-       server.listen(7000, () => {
-          console.log('Up and running on port : ' + 7000);
-       });
+       server.listen(7000)
+       return 'Up and running on port : ' + 7000;
    }

注意:我尚未证实这不会导致服务器停止监听,但这只是说明程序包将对您的功能产生什么期望。

说明

*有点老的问题了,但是最近我遇到了同样的问题,所以我想提供一个解决方案。

之所以打印“ undefined”,是因为它期望您所调用的函数有一些返回值。考虑以下功能片段(我正在研究并遇到此问题):

generate: function() {
  // ... some preliminary code
  fs.writeFile(file, modifiedFileData, error => {
    if (error) throw error
    console.log('App key generated successfully.')
  })
}

输出:

$ node utils/EncryptionKey.js generate
--------make-runnable-output--------
undefined
------------------------------------
App key generated successfully.
Done in 0.27s.

默认情况下,我只希望将该消息记录到控制台。如果没有make-runnable,它就可以正常工作,因为我最初只是运行该函数,但想将其导出。查看make-runnable的源代码(engine.js),以下函数:

function printOutput(returnValue) {
  Bluebird.resolve(returnValue)
  .then(function (output) {
    if (options.printOutputFrame) {
      console.log('--------make-runnable-output--------');
    }
    console.log(output);
    if (options.printOutputFrame) {
      console.log('------------------------------------');
    }
  }).catch(printError);
}

期望一些返回值,因为Bluebird将您正在执行的函数包装为一个承诺。我改为将初始代码更改为:

generate: function () {
  // ... some preliminary code
  fs.writeFile(file, modifiedFileData, error => {
    if (error) throw error
    return true
  })
  return 'App key generated successfully.'
}

并删除了“ undefined”值,并打印了我的应用密钥消息。

输出:

$ node utils/EncryptionKey.js generate
App key generated successfully.
Done in 0.26s.