You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Electron中调用Node-API编译的C函数报错:server is not a function

问题:Electron中Node-API调用C函数报错TypeError: server is not a function

错误信息

TypeError: server is not a function
    at Object.<anonymous> (C:\Users\cantr\Desktop\Stage ingénieur KOMILFO SPORT\Sail Vision\Test backend\index.js:3:13)
    at Module._compile (node:internal/modules/cjs/loader:1159:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1213:10)
    at Module.load (node:internal/modules/cjs/loader:1037:32)
    at Module._load (node:internal/modules/cjs/loader:878:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:23:47

Node.js v18.12.0

相关代码

index.js

const server = require("./build/Release/server");
console.log(server(12))

server.c

#include<node_api.h>

napi_value Server(napi_env env, napi_callback_info info){
    size_t argc=1;
    napi_value args[1];
    int64_t upper_limit;
    int64_t largest_prime;
    napi_value output;

    napi_get_cb_info(env,info,&argc,args,NULL,NULL);

    napi_get_value_int64(env,args[0],&upper_limit);
    largest_prime=upper_limit;
    napi_create_double(env,largest_prime,&output);
    return output;
}

napi_value init(napi_env env, napi_value exports)
{
    napi_value server;
    napi_create_function(env,NULL,0,Server,NULL,&server);

    napi_set_named_property(env, exports, "Server",server);

    return exports;
}

NAPI_MODULE(NODE_GYP_MODULE_NAME,init);

binding.gyp

{
    "variables": {
        "openssl_fips" : "0" 
    },
    "targets":[
        {
            "target_name":"server",
            "sources":[
                "server.c"
            ]
        }
    ]
}

解决方案

原因分析

你的C代码中,init函数是把Server函数作为名为"Server"的属性挂载到exports对象上的,但在index.js里你直接把整个模块导出对象当作函数调用,导致报错。

解决方法二选一:

  1. 修改index.js,调用正确的属性
    把调用语句改成访问模块的Server属性(注意首字母大写):

    const server = require("./build/Release/server");
    console.log(server.Server(12));
    
  2. 修改server.c,直接把exports设为函数
    调整init函数,直接将创建的函数赋值给exports,而不是添加属性:

    napi_value init(napi_env env, napi_value exports)
    {
        napi_create_function(env, NULL, 0, Server, NULL, &exports);
        return exports;
    }
    

    这样index.js的原有代码无需修改即可正常运行。

额外排查步骤

如果修改后仍报错,执行node-gyp rebuild重新编译C模块,确保build目录下的产物是最新的。

内容的提问来源于stack exchange,提问作者Feyto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 02:05:20