我有一个像这样的目录结构:
project
lib
paperboy
redis-client
node-cookie
srv
main.js
...
Run Code Online (Sandbox Code Playgroud)
我从项目目录启动main.js:
$ node srv/main.js
Run Code Online (Sandbox Code Playgroud)
在main.js中,我可以这样做:
paperboy = require('./lib/paperboy');
Run Code Online (Sandbox Code Playgroud)
但是,这失败了:
redis = require('./lib/redis-client');
Run Code Online (Sandbox Code Playgroud)
同样,如果我在"项目"目录中启动交互式节点,我可以要求使用paperboy,但不能使用redis-client.我得到的错误是:
> require('./lib/redis-client')
Error: Cannot find module './lib/redis-client'
at resolveModuleFilename (node.js:265:13)
at loadModule (node.js:231:20)
at require (node.js:291:14)
...
Run Code Online (Sandbox Code Playgroud)
查看resolveModuleFilename()的源代码,它会尝试打印调试字符串,我看不到:
debug("looking for " + JSON.stringify(id) + " in " + JSON.stringify(paths));
Run Code Online (Sandbox Code Playgroud)
我尝试通过导出NODE_DEBUG = 1来启用它,但在尝试要求时我仍然没有看到此调试打印.
在尝试打印这个调试时我做错了什么?第二,为什么paperboy加载得很好,但redis-client找不到?
附加信息:这是"lib"目录中的完整文件/目录列表:
lib
lib/cookie-node
lib/cookie-node/package.json
lib/cookie-node/LICENSE.txt
lib/cookie-node/README.markdown
lib/cookie-node/example
lib/cookie-node/example/ex1.js
lib/cookie-node/index.js
lib/redis-client
lib/redis-client/package.json
lib/redis-client/TODO.md
lib/redis-client/examples
lib/redis-client/examples/redis-version.js
lib/redis-client/examples/using-kiwi.js
lib/redis-client/examples/subscriber.js
lib/redis-client/examples/publisher.js
lib/redis-client/examples/.redis-version.js.swp
lib/redis-client/examples/README.md
lib/redis-client/seed.yml
lib/redis-client/LICENSE
lib/redis-client/test
lib/redis-client/test/test_throw_from_callback.js
lib/redis-client/test/test_shutdown_reconnect.js
lib/redis-client/test/test.js …Run Code Online (Sandbox Code Playgroud) 一旦在V8引擎代码中读取v8.h,我就可以找到以下宏.
#define TYPE_CHECK(T, S) \
while (false) { \
*(static_cast<T* volatile*>(0)) = static_cast<S*>(0); \
}
Run Code Online (Sandbox Code Playgroud)
我知道这是检查类型S是否与类型T兼容.在语句中,执行流如何进入while循环?while(false)表示条件始终为false.因此,while循环中的语句永远不会被执行.
结果,宏并不总是可用,是吗?
我现在正在试验V8.我希望能够在一个线程中运行一些(可能是长时间运行的)javascript,然后能够从另一个线程"优雅地"终止执行.
我写了这个简单的片段来测试Lockers的概念和TerminateExecution的用法:
void breaker( Isolate* isolate, int tid ) {
getchar(); //wait for keyboard input on stdin
std::cout << "Breaking V8 execution" << std::endl;
v8::Locker locker( isolate ); //lock the isolate
v8::V8::TerminateExecution( tid ); //and terminate it
}
int main( int argc, char **argv ) {
if( argc != 2 ) {
std::cout << "No script name given" << std::endl;
return 1;
}
Isolate* isolate = Isolate::New(); //create a new isolate
Isolate::Scope isolateScope( isolate ); //enter it
v8::Locker locker( isolate …Run Code Online (Sandbox Code Playgroud) 我有一个相当特殊的调试问题,因为我的Node应用程序本身就是一个Node调试器(应用程序的一个部分将为调试另一个部分提供调试接口).
我熟悉以下文档中记录的V8调试协议:
https://code.google.com/p/v8/wiki/DebuggerProtocol
以及使用它的多种工具(包括Node中的内部调试器,节点检查器和许多其他工具).如果我必须通过网络连接与该API通信,就像所有现有工具似乎一样,我可以这样做,但我宁愿不出于几个原因.我已经在进程中,希望避免在所有情况下打开调试端口和网络开销(这是我的生产环境的一部分),并且我想从调试API中获取Javascript对象,而不是您通过JSON API获得的JSON-ified版本(缺少一些保真度).
V8调试器文档说:"有两个API:基于函数的API使用JavaScript对象和基于消息的API使用基于JSON的协议.基于函数的API可以由进程内调试器代理使用,而消息基于API的API也可以在进程外使用."
使用JavaScript对象的基于函数的API听起来就像我需要的那样,但我在V8文档中没有看到关于此API或如何使用它的其他内容.我也无法看到如何从Node.js访问此API(或一般的V8).这是可能的,如果是这样,怎么样?
我正在尝试使用官方构建脚本并遵循官方Windows构建说明,将V8构建为ArangoDB的一部分.
所有v8*targets(v8-build.bat)的编译都失败:
msbuild All.sln /t:v8 /p:Configuration=Release /p:Platform=x64
msbuild All.sln /t:v8_libbase /p:Configuration=Release /p:Platform=x64
msbuild All.sln /t:v8_libplatform /p:Configuration=Release /p:Platform=x64
Run Code Online (Sandbox Code Playgroud)
错误MSB4057:项目中不存在目标"v8".
如果我在Visual Studio中打开解决方案文件,它看起来像这样:
我可以建立v8,v8_libbase并v8_libplatform在VS中很好.
v8 compiler-errors msbuild-target arangodb visual-studio-2013
我使用Nan调查本机Node插件.
所以我试图用以下代码返回Node一个字符串数组:
NAN_METHOD(open) {
Local<Array> v8Array = Nan::New<Array>();
std::string str = "erwer";
v8Array->Set(0, Nan::New<String>(str.c_str()) );
//v8Array->Set(0, Nan::New<Integer>(12) );
info.GetReturnValue().Set(v8Array);
}
Run Code Online (Sandbox Code Playgroud)
但它没有编译:
error: no matching function for call to ‘v8::Array::Set(int, Nan::imp::MaybeFactoryBase<v8::String>::return_t)’
v8Array->Set(0, Nan::New<String>(str.c_str()) );
但是将项添加为整数(注释行)可以正常工作.为什么我不能在数组中添加字符串?
我有工作代码,我可以根据需要创建尽可能多的Point对象,但每次调用构造函数时它都会重新创建对象模板,这看起来可能是错误的.
Local<ObjectTemplate> global_templ = ObjectTemplate::New(isolate);
// make the Point constructor function available to JS
global_templ->Set(v8::String::NewFromUtf8(isolate, "Point"), FunctionTemplate::New(isolate, v8_Point));
Run Code Online (Sandbox Code Playgroud)
然后是构造函数本身:
void v8_Point(const v8::FunctionCallbackInfo<v8::Value>& args) {
HandleScope scope(args.GetIsolate());
// this bit should probably be cached somehow
Local<ObjectTemplate> point_template = ObjectTemplate::New(args.GetIsolate());
point_template->SetInternalFieldCount(1);
point_template->SetAccessor(String::NewFromUtf8(args.GetIsolate(), "x"), GetPointX, SetPointX);
point_template->SetAccessor(String::NewFromUtf8(args.GetIsolate(), "y"), GetPointY, SetPointY);
// end section to be cached
Local<Object> obj = point_template->NewInstance();
Point * p = new Point(1,1);
obj->SetInternalField(0, External::New(args.GetIsolate(), p));
args.GetReturnValue().Set(obj);
}
Run Code Online (Sandbox Code Playgroud)
但似乎我应该能够传入point_template对象而不是每次都重新创建它.我看到args中有一个Data()字段,但是它只允许一个Value类型,而ObjectTemplate的类型是Template,而不是Value.
任何有关正确方法的帮助将不胜感激.
根据我目前关于VM及其行为的假设,我认为每次定义被击中时都会分配和编译闭包; 与在闭包之外声明的函数相比,这些函数被分配和编译一次(因为它们被放置在某个地方,它们的定义只被命中一次).这个假设是否正确?
因此,如果我有一个闭包socket.on('data', function (data) {...}),V8 每次在套接字收到数据时都会分配新内存(并可能重新编译)闭包?
因此,也许这个问题太过新手了,但是我仍然不知道为什么LIBUV在Node JS Architecture中占有一席之地?所以这是我对NodeJs架构的理解。
现在有疑问了
在此先感谢和快乐编码:)
v8 ×10
c++ ×4
node.js ×4
javascript ×2
arangodb ×1
embedded-v8 ×1
less ×1
libuv ×1
node.js-nan ×1
performance ×1
php ×1
redis ×1
require ×1