Azure Web App WebJob未安装Node软件包

5

我正在尝试使用nodejs创建webjob,这些脚本使用各种节点模块,但是当作业运行时,它似乎没有预先安装包。

我上传的zip文件中有一个带有所有依赖项的package.json和一个位于zip根目录下的server.js,脚本被执行,但是根据下面的日志,它找不到要运行的模块。

日志输出如下。

[07/28/2015 07:36:14 > 5fabb6: SYS INFO] Status changed to Initializing
[07/28/2015 07:36:14 > 5fabb6: SYS INFO] Run script 'server.js' with script host - 'NodeScriptHost'
[07/28/2015 07:36:14 > 5fabb6: SYS INFO] Status changed to Running
[07/28/2015 07:36:15 > 5fabb6: ERR ] 
[07/28/2015 07:36:15 > 5fabb6: ERR ] module.js:340
[07/28/2015 07:36:15 > 5fabb6: ERR ]     throw err;
[07/28/2015 07:36:15 > 5fabb6: ERR ]           ^
[07/28/2015 07:36:15 > 5fabb6: ERR ] Error: Cannot find module 'sendgrid'
[07/28/2015 07:36:15 > 5fabb6: ERR ]     at Function.Module._resolveFilename (module.js:338:15)
[07/28/2015 07:36:15 > 5fabb6: ERR ]     at Function.Module._load (module.js:280:25)
[07/28/2015 07:36:15 > 5fabb6: ERR ]     at Module.require (module.js:364:17)
[07/28/2015 07:36:15 > 5fabb6: ERR ]     at require (module.js:380:17)
[07/28/2015 07:36:15 > 5fabb6: ERR ]     at Object.<anonymous> (D:\home\site\wwwroot\App_Data\jobs\triggered\TestWebJob\dist\services\email.service.js:4:16)
[07/28/2015 07:36:15 > 5fabb6: ERR ]     at Module._compile (module.js:456:26)
[07/28/2015 07:36:15 > 5fabb6: ERR ]     at Object.Module._extensions..js (module.js:474:10)
[07/28/2015 07:36:15 > 5fabb6: ERR ]     at Module.load (module.js:356:32)
[07/28/2015 07:36:15 > 5fabb6: ERR ]     at Function.Module._load (module.js:312:12)
[07/28/2015 07:36:15 > 5fabb6: ERR ]     at Module.require (module.js:364:17)
[07/28/2015 07:36:15 > 5fabb6: SYS INFO] Status changed to Failed
[07/28/2015 07:36:15 > 5fabb6: SYS ERR ] Job failed due to exit code 8

我应该补充说明,我也尝试将node_modules包含在zip文件中,但这甚至无法上传,而且zip文件大小低于100mb的限制。我认为这可能是由于文件的新颖性所致。 - JohnC
4个回答

6

3
您还可以使用Visual Studio Online控制台(或Kudu控制台)进入Web作业的目录并运行npm install --production。这将安装所有依赖项。您只需要记得在.zip文件归档中包含您的package.json即可。 - Maksymilian Majer
我之前也是用“上传zip文件”的方式来做。请查看下面的答案,希望能有所帮助。 :) - Sam

2
你不应该上传 node 模块,这样做违背了简单的 git push 的初衷。同时,你也不想在 git 仓库中包含 node 模块。
“秘密”是将 node 模块依赖添加到主项目 package.json 中,然后将 Web 作业添加到基础项目文件夹中,具体结构如下:
App_Data\jobs\continuous\ [jobname]
此文件夹中的 Web 作业不需要 package.json 或 node 模块,因为它使用主项目 package.json 中指定的模块。它的主文件应该被命名为“run.js”。
我今天刚刚发现这个问题,很遗憾你必须在整个互联网上搜索才能知道你不必手动上传 Web 作业到 Azure 门户。Microsoft,请为使用 node.js 的人们添加此类事项的文档。Azure 是一个很棒的平台!但使用 node.js 的 Azure 的入门门槛很高,因为存在这样的问题。
请参阅此有用的文章以了解更多详情:

http://blog.amitapple.com/post/74215124623/deploy-azure-webjobs/#.V6JkF7grKUl


1
WebJobs在执行脚本之前不会运行npm,因此请确保在上传时包含应用程序所依赖的模块,例如通过门户将node_modules包含在上传的zip文件中。

我也尝试过这个,但它无法正确上传,尽管压缩包的大小远低于100mb。 - JohnC
这个压缩文件大小为11兆,唯一的区别是新文件还包括了node_modules。https://www.dropbox.com/s/jqmif05catz1szh/Screenshot%202015-07-28%2010.07.23.png?dl=0 - JohnC

0

你的 git 仓库不应该包含 node_modules 文件夹。

你的构建过程应该通过 npm 安装它们,然后将它们包含在要部署的软件包中(在编译后的世界中,node_modules 就像 C# 或 C++ 需要运行的所有 dlls 一样,因此它们是部署的一部分)。

另一方面,你应该插入一个间接层,而不是直接运行 "node index.js"。一个好的做法是在 run.bat 中运行 "node index.js"。这样你就可以控制它正在做什么。

Webjobs 会自动按优先顺序搜索可执行文件:com、bat 和 exe 首先出现在列表中,js 则在后面。请参见:https://learn.microsoft.com/en-us/azure/app-service/webjobs-create#acceptablefiles


感谢更新,自原问题的提问和回答以来,有很多变化。 - JohnC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接