nodejs从绝对path运行脚本

我正在使用ExpressNode.js编写一个简单的应用程序。 我的脚本path/to/script/server.js就像path/to/script/server.js 。 当我通过node server.js运行脚本,并在上面的path中,一切正常。

当我尝试运行脚本trhough node path/to/script/server.js它给我以下错误:

 Error: Failed to lookup view "index.html" in views directory "d:\views" at Function.app.render [...] 

我的views是在path/to/script/views

如何解决?

在你的path/to/script/server.js使用这个设置(代替你已经有的视图path):

 app.set('views', __dirname + '/views'); 

这个设置的默认值是process.cwd() + '/views' ,这并不完全理想。 但是,如上所示设置它将确保views目录相对于server.js而不是当前的工作目录。

有两个解决scheme,都是有见地的。

  1. 使用cd path/to/script && node server.js 。 这将改变你的当前文件夹path/to/script ,然后运行server.js 。 结果, process.cwd()将返回所需的工作文件夹。

    优点:如果依赖当前工作文件夹的其他代码,它也将开始工作。

    缺点:它看起来并不优雅,即使你不想要,也会改变提示的位置。 虽然它不是omg hacks ,而且经常使用,特别是在编写cronjob文件和应用程序启动器时。

  2. 改变你的代码不要依赖于当前的工作目录。 那就是: app.set('views', __dirname + '/views'); 这将返回脚本的目录名称,而不是您的应用程序启动的目录。

    优点:通常被认为是良好的做法,没有副作用。

    缺点:您可能需要在多个地方修改代码。 然后你的代码依赖server.js位置作为views文件夹的位置。


为什么这样? 主要是因为工作目录是一个不可或缺的信息,经常使用或者是你的好处,不仅在事物设置不正确的时候破坏事物。

它可能有用的例子:

假设有两个代码相同但服务内容不同的站点,代码位于/path/to/code ,数据位于/sites/www1/sites/www2 ,则可能发生这种情况:

cd /sites/www1 && node /path/to/code