2017-01-09 9 views
0

Работа в Node.js, я разделяю один рабочий фрагмент на два фрагмента, которые дают тот же результат. Рабочий фрагмент имеет инструкцию require и находится в корневом каталоге. Разделенные два сегмента работают на первом этапе корневого каталога, но второй этап завершается с ошибкой и сообщает, что библиотека eTrade не может быть найдена. Вот инструкция require.требуют, чтобы путь работал в корне, но не в другом месте

var etrade = require('./lib/etrade'); 

При выполнении из server.js в корневом каталоге, то все работает, но в расколотом проекте, захватив переменный появится в index.js в папке маршрутов и не работает. На стороне клиента сообщается, что библиотека eTrade не найдена. Здесь есть что-то, что я не понимаю, возможно, о том, как разрешить спецификацию пути в требовании.

В то же время, я сделал работу с использованием глобальной переменной, которую я передаю от app.js в корневом каталоге до index.js в папке маршрутов. Я могу продолжить развитие таким образом, но было бы намного лучше, если бы я понял, как сделать первый вариант работы.

отредактируйте этот вопрос и покажите иерархию файлов, а затем покажите нам, как вы объедините файлы? какие инструменты вы использовали, и где был выход

server.js работает в корне и работает очень хорошо. app.js работает в корне и является частью A объединенной системы и работает. index.js запускается в папке root/routes и является частью B объединенной системы и терпит неудачу. root/lib/eTrade содержит модули eTrade.

Рабочий фрагмент (server.js) открывает окно подтверждения на сайте eTrade, и пользователь копирует/вставляет обратно код подтверждения, который возвращается в консоль на стороне сервера. Отказоустойчивый фрагмент, который представляет собой комбинацию A и B, отказывается передать переменную (код подтверждения) в B, и поскольку она сообщает о сбое в поиске библиотеки eTrade, я думаю, что проблема заключается в пути в требовании, который is

var etrade = require ('./ lib/etrade');

Объединенная система выполняет первую часть задачи, но не передает эту переменную во вторую часть задачи, и я думаю, это потому, что переменная в B находится вне области видимости.

Здесь работает фрагмент кода:

/* 
* Module dependencies 
*/ 
const port = 3000 

var express = require('express') 
    , stylus = require('stylus') 
    , nib = require('nib') 
    , logger = require('morgan') 
    , routes = require('./routes/index') 
    , users = require('./routes/users') 
    ,app = express() 

function compile(str, path) { 
    return stylus(str) 
    .set('filename', path) 
    .use(nib()); 
} 

app.set('views', __dirname + '/views'); 
app.set('view engine', 'jade'); 

//app.use('/', routes); 
//app.use('/users', users); 
app.use(logger('dev')); 
app.use(stylus.middleware(
    { src: __dirname + '/public' 
    , compile: compile 
    } 
)); 
app.use(express.static(__dirname + '/public')) 

//from expressSite 
// from readme 
var etrade = require('./lib/etrade'); 

var configuration = 
{ 
    useSandbox : true, // true if not provided 
    key : '', //actual value deleted 
    secret : '' //actual value deleted 
} 

var et = new etrade(configuration); 
    //here we send the user a credentials link 
et.getRequestToken(
    function(authorizationUrl) { 
    // Your service requires users, who will need to visit 
    // the following URL and, after logging in and 
    // authorizing your service to access their account 
    // data, paste the E*TRADE provided verification 
    // code back into your application. 
     app.get('/', function (req, res) { 
     res.render('AuthApp', 
     { authLink : authorizationUrl } 
    ) 
     }); 

    console.log("AuthorizationURL " + authorizationUrl + " "); }, 

    function(error) { 
     console.log("Error encountered while attempting " + 
       "to retrieve a request token: " + 
       error); 
    } 
); //end getRequestToken 

//user sends confirmation code and we get acesss token 
app.get('/users/sendcode', function (req, res) { 
    console.log('verification code is '+req.query.vCode); 
//end get verification code 
    et.getAccessToken(req.query.vCode, 
     function() { 
     // Your app can start using other E*TRADE API now 
     // begin main interaction 
     // this is where we should land first after oath 
     // hand it over to the db page? 

     //et.listAccounts(); 
     //console.log(a); 
     res.render('ETQuery'); 
     console.log('thread entered getAccessToken function') 
     // console.log(AccessToken) 
     }, 

     function(error) { 
     console.log("Error encountered while attempting " + 
        "to exchange request token for access token: " + 
        error); 
     } 
    ); 
}) 

app.listen(port, (err) => { 
    if (err) { 
    return console.log('something bad happened', err) 
    } 

    console.log(`CIA is listening to the FSB on ${port}`) 
}) 

Вот новая часть А-код в app.js в корне. Вы можете увидеть, как я исправил его, чтобы использовать глобальный.

var etrade = require('./lib/etrade'); 

var configuration = 
{ 
    useSandbox : true, // true if not provided 
    key : '', //actual value deleted 
    secret : '' //actual value deleted 
} 

var et = new etrade(configuration); 
// here we send the user a credentials link 
et.getRequestToken(
    function(authorizationUrl) { 
    // Your service requires users, who will need to visit 
    // the following URL and, after logging in and 
    // authorizing your service to access their account 
    // data, paste the E*TRADE provided verification 
    // code back into your application. 
    // app.get('/', function (req, res) { 
    // res.render('index', 
    //  { authLink : authorizationUrl } 
    // ) 
    // }); 

    console.log("AuthorizationURL is " + authorizationUrl + " "); 
    global.ETauthUrl = authorizationUrl; 
}, 

    function(error) { 
     console.log("Error encountered while attempting " + 
       "to retrieve a request token: " + 
       error); 
    } 
); //end getRequestToken 

Но часть B не фиксирует токен. Что странно, так это то, что сообщается о сбое в поиске библиотеки eTrade, в то время как эта библиотека нигде не упоминается в B. В рабочем фрагменте я не могу передать токен за пределами server.js, но я могу сообщить об этом на стороне сервера после того, как пользователь вставляет его и нажимает кнопку отправки на стороне клиента. Вот В.

var router = express.Router(); 

/* GET home page. */ 
router.get('/', function(req, res) { 
    res.render('index', 
     { authLink : ETauthUrl } 
    ) 
}); 

Это работает только из-за глобальной переменной.

+0

у нас есть код? –

+0

отредактируйте вопрос и покажите иерархию файлов, а затем покажите нам, как вы объедините файлы? какие инструменты вы использовали, и где был выход –

ответ

0

./... сообщает NodeJS, чтобы загрузить соответствующий код из текущего каталога. Это будет работать в server.js, начиная с корня приложения. Однако, чтобы правильно ссылаться на указанный файл из другого каталога, вам необходимо правильно указать его путь.

E.g. учитывая:

bootstrap/ 
├── lib/ 
│ ├── etrade.js 
├── modules/ 
│ ├── foo.js 
| ├── bar/ 
|  ├── bar.js 
└── server.js 

Вы должны будете ссылаться etrade в server.js как:

var etrade = require('./lib/etrade'); 

И modules/foo.js как:

var etrade = require('../lib/etrade'); 

И modules/bar/bar.js как:

var etrade = require('../../lib/etrade'); 

More on how NodeJS require resolves files.

 
require(X) from module at path Y 
1. If X is a core module, a. return the core module b. STOP 
2. If X begins with './' or '/' or '../' a. LOAD_AS_FILE(Y + X) b. LOAD_AS_DIRECTORY(Y + X) 
3. LOAD_NODE_MODULES(X, dirname(Y)) 
4. THROW "not found" 

LOAD_AS_FILE(X) 
1. If X is a file, load X as JavaScript text. STOP 
2. If X.js is a file, load X.js as JavaScript text. STOP 
3. If X.json is a file, parse X.json to a JavaScript Object. STOP 
4. If X.node is a file, load X.node as binary addon. STOP 

LOAD_AS_DIRECTORY(X) 
1. If X/package.json is a file, a. Parse X/package.json, and look for "main" field. b. let M = X + (json main field) c. LOAD_AS_FILE(M) 
2. If X/index.js is a file, load X/index.js as JavaScript text. STOP 
3. If X/index.json is a file, parse X/index.json to a JavaScript object. STOP 
4. If X/index.node is a file, load X/index.node as binary addon. STOP 

LOAD_NODE_MODULES(X, START) 
1. let DIRS=NODE_MODULES_PATHS(START) 
2. for each DIR in DIRS: a. LOAD_AS_FILE(DIR/X) b. LOAD_AS_DIRECTORY(DIR/X) 

NODE_MODULES_PATHS(START) 
1. let PARTS = path split(START) 
2. let I = count of PARTS - 1 
3. let DIRS = [] 
4. while I >= 0, a. if PARTS[I] = "node_modules" CONTINUE b. DIR = path join(PARTS[0 .. I] + "node_modules") c. DIRS = DIRS + DIR d. let I = I - 1 
5. return DIRS