我对网络开发比较陌生,对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
答案 0 :(得分:1)
如果route_index.js
是routes/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);