尝试为node.js制作Hello World原生模块
在 VS 2012 中获得一个只有一个文件的 Win32 项目:
#include <node.h>
#include <v8.h>
using namespace v8;
Handle<Value> Method(const Arguments& args) {
HandleScope scope;
return scope.Close(String::New("world"));
}
void init(Handle<Object> target) {
target->Set(String::NewSymbol("hello"),
FunctionTemplate::New(Method)->GetFunction());
}
NODE_MODULE(hello, init)
编译为 hello.node。
选项:
像这样使用它:
hello = require './hello'
console.log hello.hello()
它适用于本地计算机(win8 x64,节点:0.8.12)
但在远程服务器(Windows Server 2008 x64,节点:0.8.12,iisnode:0.1.21 x64,iis7)上,它会抛出此错误:
应用程序抛出未捕获的异常并终止:错误:
%1 不是有效的 Win32 应用程序。C:\inetpub est\lib\server\hello.node
在 Object.Module._extensions..node (module.js:485:11)
在 Module.load (module.js:356:32)
在 Function.Module._load (module.js:312:12)
在 Module.require (module.js:362:17)
在需要时(module.js:378:17)
在对象。 (C:\inetpub est\lib\server\index.js:32:9)
在 Module._compile (module.js:449:26)
在 Object.Module._extensions..js (module.js:467:10)
在 Module.load (module.js:356:32)
在 Function.Module._load (module.js:312:12)
我尝试过的:
使用应用程序池设置(启用 win32 应用程序)没有帮助。
Iisnode x86 无法安装在 x64 操作系统上。
由于错误而无法编译为 x64:错误 2 错误 LNK1112:模块机器类型“X86”与目标机器类型“x64”冲突 C:\derby\hello uild
ode.lib(node.exe) 你好
有人有什么建议吗?
我不知道是否为时已晚,但经过一番尝试和错误后我找到了答案,主要问题(在我的机器上)是我在Windows上编译了nodejs以便能够使用Visual C++创建扩展,并且我已经已经从页面安装了nodejs,如果我尝试使用默认安装(由nodejs安装程序添加到我的PATH中)运行测试,那么它会失败,但是如果我使用编译后的node.exe(我编译的那个)能够引用 Visual C++ 中的库)然后它就可以工作了。
总而言之,问题不在于扩展,而在于nodejs编译,使用您编译的节点(为了构建VS解决方案,我假设您这样做),然后它应该在远程计算机上工作。
注意:这个问题依赖于你使用64位编译的node.exe来运行32位dll,这就是它抱怨的原因,如果你使用32位的node.exe它应该可以工作。 (至少解决了我的问题)
刚刚遇到了同样的问题,即使我的节点和插件的架构相同,我也收到了类似的错误消息。事实证明,您无法重命名节点可执行文件。它必须是
node.exe
,我试图同时测试多个版本,所以我不得不将它们放在自己的文件夹中。之后一切正常。
就我而言,问题是尝试在 Windows 上执行使用 Linux 构建(针对 Windows)的 Electron 应用程序。我通过使用 Windows 构建它(对于 Windows)来解决。
为了在 Windows 上构建它,我使用了以下命令:
npm install --global-production windows-build-tools
npm install
npm run build:prod && electron-builder build --windows
要执行您需要的最后一个命令electron-builder,如果您没有with
请安装它npm install --save-dev electron-builder
使用 Electron Forge webpack typescript 样板。这对我有用:
在
webpack.main.config.js
中添加externals: ['sqlite3']
:
module.exports = {
/**
* This is the main entry point for your application, it's the first file
* that runs in the main process.
*/
entry: './src/electron-entrypoint.ts',
// Put your normal webpack config below here
module: {
rules: require('./webpack.rules'),
},
resolve: {
extensions: ['.js', '.ts', '.jsx', '.tsx', '.css', '.json']
},
externals: ['sqlite3']
};
或者-这也对我有用-,您可以使用better-sqlite3,如建议的here
与您的问题无关:当尝试执行扩展名为“.node”的脚本时,我遇到了相同的错误(
Error: %1 is not a valid Win32 application
),例如node.exe example.node
。其他扩展名(.js、.txt、根本没有扩展名)工作正常。