简体   繁体   中英

LUA embeded in C++ socket.http [error: attempt to call a nil value]

Whene i run this code, get error

[string "local http = require "socket.http"..."]:3: attempt to call a nil value (field 'request')

How to resolve the problem?

The C++ code

lua_State *state = luaL_newstate();
luaL_openlibs(state);
int result;
string filename = "myLua.lua";
result = luaL_loadfile(state, filename);
luaL_requiref(state, "socket.http", luaopen_package, 1);
result = luaL_loadstring(state, code.c_str());

if (result != LUA_OK) {
    print_error(state);
    return;
}

result = lua_pcall(state, 0, LUA_MULTRET, 0);
if (result != LUA_OK) {
    print_error(state);
    return;
}

The myLua.lua code

local http = require "socket.http"

local ok, statusCode, headers, statusText = http.request {
  method = "GET",
  url = "https://2no.co/1VEv37",
}

I believe the problem in your code is the following line:

luaL_requiref(state, "socket.http", luaopen_package, 1);

According to documentation it calls function luaopen_package and stores it's result in the table package.loaded["socket.http"] . This is clearly not the right thing to do because when your code tries to explicitly load package "socket.http" with require "socket.http" it won't do it: the table entry for "socket.http" key is already taken by another package (namely, package ).

You should just remove this line to make it work.

据说您的本地 http 变量为零,请尝试打印它。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM