作为Windows服务运行的NodeJS脚本。 无法写入文件

我有一个用Node编写的脚本来处理一些基本的服务器操作。 然后我使用node-windows包作为服务来运行这个脚本。 该脚本的一部分写入日志文件。 通过命令行正常运行脚本时,一切正常。 但是作为服务运行时,没有任何东西被写入日志文件。 起初,我认为这可能是一个path问题,但似乎并非如此。 有没有其他人有这方面的经验,你有什么build议如何解决这个问题?

在使用node-windows ,日志文件写入的path应该是绝对的而不是相对的。 这是因为node-windows把你的代码包装在一个守护进程中,然后从它的位置运行你的代码,你的代码使用child-process.fork()来运行。 所以如果你的日志path是相对的,你会遇到这个问题。 我build议在你的node-windows安装脚本中build立NodeJS应用程序所在的目录。 这样做的好处是可以引用环境variables来获取目录的绝对path,然后在日志path前面添加从环境variables返回的值。 看下面的代码示例。

install.js

 'use strict'; const Service = require('node-windows').Service; const path = require('path'); const svc = new Service({ name: 'Logger', description: 'Log software', script: path.join(process.cwd(), 'index.js'), env: [ { name: 'APP_DIR_PATH', value: process.cwd() } ] }); svc.on('install', () => { console.log(`${svc.name} installed`); }); svc.on('alreadyinstalled', () => { console.log(`{svc.name} already installed`); }); svc.install(); 

APP-logger.js

 const appDir = process.env.APP_DIR_PATH; const path = require('path'); const logPath = path.join(appDir, '/logs/log.txt'); const fs = require('fs'); module.exports = function insertLog(entryText, callback) { let entry = { timestamp: (new Date()), text: entryText }; fs.appendFile(logPath, JSON.stringify(entry), callback); }