若使用 eval 来做类似 import 用途,之后 debug 方式?
发布于 4天前 作者 grass0916 120 次浏览 来自 问答

由于自己不想过多的程式码挤在同一个档案中,在 stackoverflow 中查询 Node 如何 import 其他的 .js。

多半的解法不外乎就是将这些 .js export.module,然后 require 它。不过因为一些设计考量(我的变数 scope),此法不太适合我。

于是乎我看到了有人使用 eval 完成了我的需求,在当下我明知道 eval === evil 般的恐怖我还是使用了。程式码日益壮大,直到现今的除错讯息真的被 eval 阴了,请见下举例错误讯息:

ReferenceError: userInSession is not defined
    at async.waterfall.getUser.uid (eval at <anonymous> (/Users/Salmon/GitHub/Bounty-Workers/serverSide/web.js:119:9), <anonymous>:88:5)
    at fn (/Users/Salmon/GitHub/Bounty-Workers/node_modules/async/lib/async.js:641:34)
    at Object._onImmediate (/Users/Salmon/GitHub/Bounty-Workers/node_modules/async/lib/async.js:557:34)
    at processImmediate [as _immediateCallback] (timers.js:336:15)

eval at <anonymous> 正常的错误讯息都应该明确指示出呼叫的函数为何者,但只说是 eval 执行的匿名函数(anonymous function)與错误的行数,这将造成开发者大大的困扰啊 …

不晓得各位前辈有没有较好的解决方式呢?

10 回复

module是正道。

@JacksonTian 前辈您好,不晓得您方不方便给予我更多建议?

我举一个例子来描述,一个使用者的帐户系统,有「建立帐户、登入、修改帐户… 等」功能,我想将它们拆分成不同的档案,但都会需要最外层的 express.js 的 module (var app = require(‘express’))才可以使用,但是这些子档案没有取用参数 app 的能力,因为它们的 scope 不相同,这样子该如何处理呢?谢谢您!

express app 在此情形是众多 require 近来的库之一,所以没办法说传入 app 就解决的样子。

隐约间能感觉到你好像在说什么 如果我的回复不正确就无视吧 把你说的最外层的express降级 用application做最外层。。。。

@dayuoba 您好,大概就是这样子

var .... (其他的庫)
var express = require('express');
var app = express();

app.get('/', function(req, res) {
  res.send();
});

app.get('/create', function(req, res) {
  res.send();
});

app.get('/login', function(req, res) {
  res.send();
});

我想要将不同的 app.xxx(…); 依照性质拆分成不同的档案歸類

var router = require('./router.js');
router(application);
//router.js
module.exports = function(application) {
  var expressApp = application.expressApp;
  var otherModules = application.otherMoudles;
  expressApp.get('/', function(req, res) {
        //use ohtersModules here
        //res.render()
  });  
  
}; 

不知道是不是想要这种。。

@dayuoba 看起来真棒,请问是这样的 application 吗?

var application = {};
application. ... = 其他的庫;
application.express = require('express');
application.expressApp = express();

@dayuoba 真的很谢谢您,我现在立马试试!

回到顶部