Node.js 生成可运行输出后服务器控制台上未定义

Node.js 生成可运行输出后服务器控制台上未定义,node.js,express,Node.js,Express,我在nodejs上创建了一个简单的html应用程序。下面是代码osserver.ts import express = require('express'); import http = require('http'); import path = require('path'); import cookieParser = require('cookie-parser'); export class Server { static startServer() { l

我在nodejs上创建了一个简单的html应用程序。下面是代码osserver.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.
原因是什么?

解决方案 通过导入“自定义”模块并为
printOutputFrame
指定布尔值,使用
make runnable
包可以清除输出帧。不要使用
require('make-runnable')
,而是使用:

require('make-runnable/custom'))({
printOutputFrame:false
})
但是,这并不会删除“undefined”(或output)消息,因为
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(){
//…一些初步代码
fs.writeFile(文件,modifiedFileData,错误=>{
如果(错误)抛出错误
console.log('已成功生成应用程序密钥')
})
}
输出:

$node utils/EncryptionKey.js生成
--------生成可运行的输出--------
未定义
------------------------------------
已成功生成应用程序密钥。
在0.27秒内完成。
默认情况下,我只希望将该消息记录到控制台。如果没有
make runnable
,它工作得很好,因为我最初只是运行这个函数,但想将其导出。查看
make runnable
的源代码(engine.js),以下函数:

函数打印输出(返回值){
蓝鸟解析(返回值)
.then(函数(输出){
if(options.printOutputFrame){
log('--make runnable output-------');
}
控制台日志(输出);
if(options.printOutputFrame){
console.log('-------------------------------------');
}
}).catch(打印错误);
}
需要一些返回值,因为Bluebird将您正在执行的函数包装为承诺。我将初始代码改为:

generate:function(){
//…一些初步代码
fs.writeFile(文件,modifiedFileData,错误=>{
如果(错误)抛出错误
返回真值
})
返回“成功生成应用程序密钥”
}
并删除“未定义”值,并打印我的应用程序密钥消息

输出:

$node utils/EncryptionKey.js生成
已成功生成应用程序密钥。
在0.26秒内完成。
解决方案 通过导入“自定义”模块并为
printOutputFrame
指定布尔值,使用
make runnable
包可以清除输出帧。不要使用
require('make-runnable')
,而是使用:

require('make-runnable/custom'))({
printOutputFrame:false
})
但是,这并不会删除“undefined”(或output)消息,因为
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(){
//…一些初步代码
fs.writeFile(文件,modifiedFileData,错误=>{
如果(错误)抛出错误
console.log('已成功生成应用程序密钥')
})
}
输出:

$node utils/EncryptionKey.js生成
--------生成可运行的输出--------
未定义
------------------------------------
已成功生成应用程序密钥。
在0.27秒内完成。
默认情况下,我只希望将该消息记录到控制台。如果没有
make runnable
,它工作得很好,因为我最初只是运行这个函数,但想将其导出。查看
make runnable
的源代码(engine.js),以下函数:

函数打印输出(返回值){
蓝鸟解析(返回值)
.then(函数(输出){
if(options.printOutputFrame){
log('--make runnable output-------');
}
控制台日志(输出);
if(options.printOutputFrame){
console.log('-------------------------------------');
}
}).catch(打印错误);
}
需要一些返回值,因为Bluebird将您正在执行的函数包装为承诺。我将初始代码改为:

generate:function(){
//…一些初步代码
fs.writeFile(文件,modifiedFileData,错误=>{
如果(错误)抛出错误
返回真值
})
返回“成功生成应用程序密钥”
}
并删除“未定义”值,并打印我的应用程序密钥消息

输出:

$node utils/EncryptionKey.js生成
应用程序密钥生成成功