是否可以在没有任何模板引擎的情况下使用express?
我的应用程序结构为:
/app
/css
/js
..
/script
/server.js
我正在尝试使用__dirname来指向/ app文件夹
app.use(express.static( __dirname + '/app'));
我真的不知道在网上搜索什么,请帮忙。
我在服务器上有一个非常重量级的查询,可以生成新的页面渲染,并且我希望将查询的一些结果传递给客户端(作为对象的javascript数组)。 基本上是这样,因此我不必稍后再进行单独的JSON查询即可获得相同的内容(通常是静态的)。 数据最终将是有用的,但最初没有用,因此我没有将其直接放入文档中。
app.get('/expensiveCall', function(req, res) {
// do expensive call
var data = veryExpensiveFunction();
res.render('expensiveCall.jade', {
locals: {
data: data,
}
});
});
});
数据是一个对象数组,最初只使用一些对象。 我想传递整个数据或传递一些子集(取决于情况)。 我的玉看起来像普通的玉,但我想加入一些类似的东西
<script type="text/javascript">
var data = #{data};
</script>
但这不起作用(它是一个对象数组)。
在我的require('../models/User');
文件中:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var userSchema = new Schema({
(define schema)
});
...
(save user)
...
(check password)
...
mongoose.model('User', userSchema);
在我的require('../models/User');
中,我有:
var mongoose = require('mongoose');
var User = mongoose.model('User');
引发错误:
MissingSchemaError: Schema hasn't been registered for model "User".
但是,如果在require('../models/User');
中,我做了(在最后一行中)
module.exports = mongoose.model('User', userSchema);
然后在require('../models/User');
中执行var User = mongoose.model('User');
,则一切正常。
但这不应该,因为在require('../models/User');
中,我正在执行var User = mongoose.model('User');
,它可以完美地工作。
require('../models/User');
语法在Ubuntu上不起作用,但在我的Mac上可用。
我该怎么办? 我如何解决它? 我查看了无数示例应用程序,包括MEAN,但没有任何真正的帮助。
我使用Express.js ver 4.2,并希望解析较大的帖子(150K-1M),但收到错误消息“请求实体太大”。 似乎限制为100K。我现在不打算在Express 4中更改限制。在Express 3.x中,我只是做了-
app.use(express.json({limit: '5mb'}));
app.use(express.urlencoded({limit: '5mb'}));
如何更改Express 4中的限制?
谢谢你的帮助。
我正在使用Mikeal的请求([https://github.com/mikeal/request)]向服务器发出https请求。 但是,我不断收到CERT_HAS_EXPIRED的授权错误。
request({
url: 'https://www.domain.com/api/endpoint',
strictSSL: false
}, function(error, response, body) {
if(!error && response.statusCode == 200) {
res.json(JSON.parse(body));
} else {
res.json(response.statusCode, {'error': 'error'})
}
});
我尝试将strictSSL设置为true和false,两者都输出相同的CERT_HAS_EXPIRED错误。 是什么导致此问题,并且有什么方法可以在nodejs中进行修复?
用户请求一些页面,我想(在服务器端)知道他/她的浏览器中的语言是什么。 因此,我可以使用正确的消息来呈现模板。
在客户端,这很容易:
var language = window.navigator.userLanguage || window.navigator.language
当前是否可以获取node.js HTTP / 2(HTTP 2.0)服务器? 以及Express.js的HTTP 2.0版本?
我正在尝试使用sequelize从数据库中输出所有对象列表,如下所示,并希望在我在where子句中添加id时对数据进行整理。
exports.getStaticCompanies = function () {
return Company.findAll({
where: {
id: [46128, 2865, 49569, 1488, 45600, 61991, 1418, 61919, 53326, 61680]
},
attributes: ['id', 'logo_version', 'logo_content_type', 'name', 'updated_at']
});
};
但是问题是渲染后,所有数据按如下进行整理。
46128, 53326, 2865, 1488, 45600, 61680, 49569, 1418, ....
正如我发现的那样,它既没有按ID也没有按名称排序。 请帮我解决。
我正在使用express的socketIO。
在我的项目中,我有一个登录页面和一个主页。当我成功登录后,我导航到localhost:3000 / home,我收到此错误:
GET http://localhost:3000/socket.io/?EIO=3&transport=polling&t=1418187395022-0 404 (Not Found)
我没有对app.js(express创建的项目)进行任何修改。
Index.js:
var express = require('express');
var router = express.Router();
var http = require('http');
var fs = require('fs');
var io = require('socket.io')(http);
/* GET home page. */
router.get('/', function(req, res) {
res.render('index', { title: 'Express' });
});
router.get('/home', function(req, res) {
res.render('home', { title: 'Express' });
});
io.on('connection', function(socket){
console.log("User Connected");
socket.on('chat message', function(msg){
io.emit('chat message', msg);
console.log("Message");
});
socket.on('disconnect', function(msg){
console.log("User DisConnected");
});
});
router.post('/authenticate', function(req, res) {
fs.readFile("./public/Verification/Users.json", "utf8", function (err, data) {
if (err)
console.log(err);
else{
var result = JSON.parse(data);
for(var i=0;i<result.Users.length;i++){
if(req.body.username == result.Users[i].username && req.body.password == result.Users[i].password){
console.log("Success!!!!!!!!!!!!!!");
res.location("home");
res.redirect("home");
}
}
}
});
});
module.exports = router;
每当我导航到localhost:3000 / home时,都会出现此错误。 我对socketIO和express都是陌生的。请告诉我我是否缺少什么。
谢谢
编辑:
在我的layout.jade中,我这样定义了socketio:
script(src='https://cdn.socket.io/socket.io-1.2.0.js')
我正在将我的一个应用程序从Express转换为sails.js-是否可以在Sails中执行类似的操作?
从我在Express中的app.js
文件中:
var globals = {
name: 'projectName',
author: 'authorName'
};
app.get('/', function (req, res) {
globals.page_title = 'Home';
res.render('index', globals);
});
这使我可以在每个视图上访问这些变量,而不必将其硬编码到模板中。 虽然不确定在Sails中如何/在哪里做。
我在尝试在应用程序中执行POST请求时遇到问题,我进行了很多搜索,但找不到解决方案。
因此,我有一个nodeJS应用程序和一个网站,并且尝试使用此网站中的表单进行POST请求,但我总是这样做:
在控制台中,我看到:
Uncaught TypeError: Cannot read property 'value' of null
Post "http://name.github.io/APP-example/file.html " not allowed
在这行代码中:
file.html:
<form id="add_Emails" method ="POST" action="">
<textarea rows="5" cols="50" name="email">Put the emails here...
</textarea>
<p>
<INPUT type="submit" onclick="sendInvitation()" name='sendInvitationButton' value ='Send Invitation'/>
</p>
</form>
<script src="scripts/file.js"></script>
file.js:
function sendInvitation(){
var teammateEmail= document.getElementById("email").value;
我读了很多帖子和跨域文档,但是没有用。研究资料1:[http://enable-cors.org/server.html]研究资料2:[http://www.w3.org/TR/2013/CR-cors-20130129/#http-access-control-max-age]
我现在在做什么:
我正在尝试从服务器的其他域POST:
POST请求:[http://name.github.io/APP-example/file.html],github存储库
POST LISTENER:“ [http://xxx.xxx.x.xx:9000 / email],服务器本地主机(x->我的IP地址)
因此,我在其他文件中也遇到了同样的问题,但我修复了此问题,并将此代码放在每个路由的开头:
var express = require('express');
var sha1 = require('sha1');
var router = express.Router();
var sessionOBJ = require('./session');
var teams = {}
var teamPlayers = []
router.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Methods", "PUT, GET,POST");
next();
});
然后我就解决了
现在,我遇到了同样的问题,但是在此文件中,唯一的区别是我处理SMTP和电子邮件,因此我发布了一封电子邮件,并向POST请求中收到的该电子邮件发送了一封电子邮件。
该代码在POSTMAN上完全可以正常工作,因此,当我在POSTMAN上进行测试时,它可以正常工作并且可以发布。
我在下面包含了此代码,而不是我显示的第一个代码,但它不能正常运行:
router.all('*', function(req, res, next){
res.header("Access-Control-Allow-Origin", "*")
res.header("Access-Control-Allow-Methods", "POST, GET, OPTIONS")
res.header("Access-Control-Allow-Headers", "Origin, Content-Type, Accept")
res.header("Access-Control-Max-Age", "1728000")
next();
});
有人知道如何解决吗?
谢谢。
我已经寻找了一段时间,但是找不到确切的文档来源。 当我搜索这些内容时,第一个Google搜索结果就是StackOverflow。
还有其他类似的中间件功能吗?
我正在使用一台服务器托管多个Node.js Web应用程序,这些Web应用程序分布在多个域中。 我目前的做法是在不同端口上为每个应用程序运行Express服务器,并运行基本服务器,该服务器简单地将请求路由(重定向)到正确的端口/ Express服务器。 这可行,但是这意味着我的基本服务器正在路由每个HTTP请求(并通过手动重定向它),并且我的用户看到我的应用托管在[hostname.com]:8000。
经过一番研究,我发现可以使用http-proxy来满足我的路由需求,但是我仍然想知道是否有在同一系统上运行多个Express服务器的最佳实践。 这是我打算做的事情:
每个Web应用程序都有其自己的文件夹,具有完整的Express文件夹结构(app.js,路线,视图等)。应用程序将按域分组,因此示例文件夹结构为:
hostname.com/
app.js
routes/
views/
...
app1/
app1.js
routes/
views/
...
app2
...
hostname2.com/
app.js
routes/
views/
...
我必须分别使用node(或永久使用,我当前正在使用)运行每个app.js,并且每个内部都必须使用不同的端口,跨应用程序重定向指向该端口。 目标应用。
所以,那是我目前的计划。 它有什么问题,我应该尝试避免哪些陷阱?最重要的是,是否存在针对此问题的既定解决方案-使用Node.js / Express在同一系统上托管多个Web应用程序的问题?
编辑:我确实打算最终使用WebSockets和HTTPS,并且我的安装程序可以支持的带宽量对我而言并不重要-这是一台开发服务器(至少现在是这样)。 感谢David Ellis提出了WebSockets问题。
第二次编辑:感谢EhevuTov和David Ellis的回答,这两者都大有帮助。 我仍在为我的应用程序确定总体结构,并且看起来这个StackOverflow问题已解决了该问题的更多细节
第三次编辑:自发布此问题以来,我已经采取了一些措施(尽管我还有很长的路要走)。 在我的GitHub存储库中签出该文件,该文件利用了我从该问题的答案中学到的知识!
有人可以给我一个关于如何将Promise与猫鼬一起使用的示例。 这是我所拥有的,但无法正常工作:
app.use(function (req, res, next) {
res.local('myStuff', myLib.process(req.path, something));
console.log(res.local('myStuff'));
next();
});
然后在myLib中,我将得到以下内容:
exports.process = function ( r, callback ) {
var promise = new mongoose.Promise;
if(callback) promise.addBack(callback);
Content.find( {route : r }, function (err, docs) {
promise.resolve.bind(promise)(err, docs);
});
return promise;
};
在某个时候,我希望我的数据能够存在,但是我该如何访问或获取它呢?
我想知道在错误处理中使用nodejs的Error对象表示的功能是什么?
错误调用new Error('NotFound')
的console.log
仅显示[Error: NotFound]
,这是因为重写了.toString()
方法吗? 如何找到这些对象公开的属性和功能?
当我在MongoDB / Node / Express中运行collection.find()
时,我想在完成时得到一个回调。 正确的语法是什么?
function (id,callback) {
var o_id = new BSON.ObjectID(id);
db.open(function(err,db){
db.collection('users',function(err,collection){
collection.find({'_id':o_id},function(err,results){ //What's the correct callback synatax here?
db.close();
callback(results);
}) //find
}) //collection
}); //open
}
我需要检查文件/(自定义)模块js是否存在于某些路径下。 我试过像
var m = require('/home/test_node_project/per');
但是当路径中没有per.js时,它将引发错误。我想跟 fs
如果文件存在,但我不想在没有后缀的情况下添加'.js'
作为后缀。如何检查节点是否存在模块以及是否存在要加载的模块?
由于某种原因,我的节点服务器无法服务路由/socket.io/socket.io.js
,我总是收到404错误。
我尝试编译不同的节点版本(当前版本为0.6.13,该版本也可以在实际工作的服务器上运行)。
从app.js中,我得到info: socket.io started
,并且在尝试调用socket.io.js时没有错误。
我从本地主机和端口8000尝试,我使用express框架
这是来自app.js的代码:
var express = require('express')
, app = require('express').createServer()
, io = require('socket.io').listen(app, { log: true });
app.listen(8000);
app.configure(function() {
app.use(express.static(__dirname + '/public'));
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
io.sockets.on('connection', function (socket) {
// all other stuff here
我目前正在尝试为我的node.js应用设置基本的身份验证系统。 现在,我使用快递(3.0.0rc5),通行证(0.1.12)和socket.io(0.9.10),将Mongoose作为会话数据存储。 我也一直在玩deserializeUser
,但是我不喜欢兑现承诺。
现在的情况:
通过护照(facebook策略)的身份验证成功,重定向后在客户端上设置了deserializeUser
cookie,我能够在数据库中看到会话文档。 我可以通过socket.handshake.headers.cookie
访问socket.io
中的会话cookie。
如果我正确理解了护照概念,则在成功致电deserializeUser
之后,可以将其添加到会话中。 就我而言,最重要的信息是电子邮件,因此我通过以下方式设置了序列化程序:
passport.serializeUser(function(user, done) {
done(null, user.email);
});
现在,我只需要在我的socket.io事件中使用cookie信息来从会话中提取电子邮件地址。
var connect = require('connect'),
parseSignedCookie = connect.utils.parseSignedCookie,
cookie = require('express/node_modules/cookie');
io.on('connection', function(socket) {
if(socket.handshake.headers.cookie) {
var cookie = cookie.parse(socket.handshake.headers.cookie);
var sessionID = parseSignedCookie(cookie['connect.sid'], 'secret');
}
});
passport.deserializeUser(function(id, done) {
// so, what is supposed to be done here?
});
因此,如果我没记错的话,现在的任务是使用deserializeUser
访问相应的电子邮件地址。
我该怎么办? 任何指针都受到高度赞赏。