node.js跨文件导出变量

时间:2015-08-06 23:14:37

标签: node.js express chef middleware

我对网络开发比较陌生,对node.js来说是全新的。

我正在尝试使用express来创建一个使用chef-node api客户端更新api的网站,使用this tutorial

如果我创建一个独立的node.js应用程序,它会按预期工作,并且值'bacon'设置为'good'

app1.js

use strict;
use warnings;
use autodie;

my $file = 'sample.txt';
my $literal_string = '...';

open my $fh, '<', $file;

while (my $line = <$fh>){
    if ($line =~ /^\Q$literal_string\E/){
       doSomething();
    }
}

Full code is here。 该应用基本上看起来像这样:
app.js

var fs = require('fs'),
    chef = require('chef'),
    key = fs.readFileSync('/Users/foo.pem'),
    chef_client = chef.createClient('foo', key, 'https://chef.example.com/organizations/dev');

var mybreakfast = { "id":"food","bacon":"good"}
chef_client.put('/data/breakfast/food', mybreakfast,  function(err,res,body) {
  if (err) { return console.log(err); }
  console.log(body)
});

路由/ index.js

var fs = require('fs'),
    chef = require('chef'),
    key = fs.readFileSync('/Users/foo.pem'),
    chef_client = chef.createClient('foo', key, 'https://chef.example.com/organizations/dev');
 ...
 //tutorial says this isn't ideal, but it is quickest way to get working
 app.use(function(req,res,next){
     req.client = chef_client;
     next();
 });

抢答/ databags.jade

var express = require('express');

var router = express.Router();

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

router.get('/databags', function(req, res) {
  req.client.get('/data/breakfast/food',  function(err,res,body) {
    if (err) { return console.log(err); }
    console.log("Found breakfast")
    console.log(body)
    bag_data = body; //TODO: Global variable is bad and you should feel bad, how do I use correct variable?
  });
  res.render('databags.jade', { title: 'Databags', somedata: bag_data });
});

router.post('/databags', function(req, res) {
  var mybreakfast = { "id":"food","bacon":"good"}
  req.client.put('/data/breakfast/food', mybreakfast,  function(err,res,body) {
    if (err) { return console.log(err); }
    console.log(body)
  });

});

当我按下/ databags中的提交按钮时,我得到301并且没有上传数据。

html
  body
    form(action='/databags', id='derp', method='POST')
      each value, key in somedata
        label #{key}  
        input(type='text',name="#{key}", value="#{value}")
        br
        br
      input(type='submit', value='Submit', form='derp')

我怀疑问题与我为每个请求添加客户端这一事实有关。

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>openresty/1.7.10.1</center>
</body>
</html>

在routes / index.js中使app.js中的chef_client变量可用的正确方法是什么?

如果这是正确的方法,那么可以使应用程序单独工作,但是当与快速框架一起使用时却没有?

由于这是我的第一个node.js / express网站,因此非常感谢任何其他建议让这个应用程序正常工作。

更新

已找到解决方案,可在此处使用代码段:https://gist.github.com/spuder/1e39868b6a9a0c3cdb13

1 个答案:

答案 0 :(得分:1)

如果route_index.jsroutes/index.js,那么您的问题是您实际上并未从中导出任何内容。当您require('routes/index')时,您将在该文件中找回您设置module.exports的任何内容。

这意味着您的routes/index.js文件应以:

结尾
module.exports = router;

要解决有关如何在没有全局的情况下共享chef_client的问题,您可以从routes/index.js返回工厂,该工厂使用您传递给它的参数返回实例化的路由器。这看起来像这样:

<强>路由/ chef.js

function addChefRoutes(router, chefClient) {
  router.get('databags', function(res,req){
    // ...
  }
});

module.exports = addChefRoutes;

<强> app.js

var chefClient = chef.createClient('foo', key, 'https://chef.example.com/organizations/dev');
var addChefRoutes = require('./routes/chef');
var router = express.Router();

addChefRoutes(router, chefClient);