草庐IT

node.js - NodeJS/Express/Mongoose 发送后报错Can't set headers

coder 2023-11-04 原文

我正在使用 MEAN 堆栈和 Mongoose 来查询 MongoDB 上的数据。第一次调用/api/Validations 没问题,但第二次,它总是会收到此错误:

这是我的代码,server.js:

var express = require('express')
    , app = express()
    , bodyParser = require('body-parser')
    , breezeRoutes = require('./breeze-routes')
    , controller = require('./controller')
    , compress = require('compression')
    , cors = require('cors')
    , errorHandler = require('./errorHandler')
    , favicon = require('static-favicon')
    , fileServer = require('serve-static')
    , http = require('http')
    , isDev = app.get('env') === 'development'
    , logger = require('morgan')
    , port = process.env["PORT"] || 4000;

app.use(favicon());
app.use(logger('dev'));
app.use(compress());
app.use(bodyParser()); // both json & urlencoded  
app.use(cors());          // enable ALL CORS requests
controller.init(app); // Configure  routes for REST API      
app.use(errorHandler);

// create server (in case interested in socket.io)
var server = http.createServer(app);

// Start listening for HTTP requests
server.listen(port); // app.listen( port ); // if we weren't using 'server'

console.log('\nListening on port ' + port);

controller.js:

(function (controller) {
    var mongooseDB = require("./mongooseDB");

    controller.init = configureRoutes;
    function configureRoutes(app) {  
        app.get('/api/Validations', getValidations);     
    }  

    function getValidations(req, res, next) {
        mongooseDB.getValidations(makeResponseHandler(res, next));
    }

    function makeResponseHandler(res, next) {
        // returns a function that handles response from a Breeze Mongo query or save
        return function (err, results) {
            if (err) {
                next(err);
            } else {
                // Prevent browser from caching results of API data requests
                //res.setHeader('Cache-Control', 'no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0');
                //res.setHeader("Content-Type:", "application/json");
                res.send(JSON.stringify(results));
                res.end();
            }

        }
    } 
})(module.exports)

Mongoose 数据库

(function (mongooseDB) {
    var schema = require("./schema");
    var validator = require("./validator");
    var mongoUrl = 'mongodb://localhost:27017/dpt';
    var mongoose = require('mongoose');
    var Validations = mongoose.model('Validations', schema.ValidationSchema);

    mongooseDB.getValidations = function (next) {
        mongoose.connect(mongoUrl);
        mongoose.connection.on('open', function () {
            var query = Validations.find();
            query.exec(function (err, docs) {
                mongoose.disconnect();
                if (err) {
                    next(err, null);
                } else {
                    next(null, docs);
                }
            });
        });
    };
})(module.exports)

验证架构.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var validationSchema = new Schema({
    ValidationID: { type: String, index: 1, required: true, unique: true },
    Integer: { type: Number, required: true },
    String: String,
    Date: Date,
    BeforeDate: Date,
    AfterDate: Date,
    Age: Number,
    CreditCard : Number,
    Email: String,
    Phone: String,
    URL: String,
    Zip: String,
    StartsWithDPT: String,
    ContainsDPT: String
}, { collection: 'Validations' });
exports.ValidationSchema = validationSchema;

我在堆栈溢出时阅读了所有“发送后无法设置 header ”,并尝试应用一些方法但没有成功。 请帮助我。

更新 1:

我认为这是 Mongoose 问题,因为在我将其更改为使用 MongoDB 后,它工作正常: (函数(数据库){ var MongoClient = require('mongodb').MongoClient;

        database.getDb = getDb;
        database.getValidations = getValidations;

        var db = null;
        // todo: get from configuration
        var mongoUrl = 'mongodb://localhost:27017/dpt';
        var mongoOptions = {
            server: { auto_reconnect: true }
        };

        function getDb(next) {
            if (db) {
                next(null, db);
            } else {
                MongoClient.connect(mongoUrl, mongoOptions, function (err, theDb) {
                    if (err) {
                        err.message = (err.message || '') + '. Is the MongoDb server running?';
                        next(err, null);
                    } else {
                        db = theDb;
                        next(null, db);
                    }
                });
            }
        }

        function getValidations(next) {
            getDb(function (err, data) {
                if (err) {
                    err.message = (err.message || '') + '. Is the MongoDb server running?';
                    next(err, null);
                } else {
                    data.collection("Validations").find().toArray(function (err1, results) {
                        next(null, results);
                    });;

                }
            });
        }    
})(module.exports)

现在我可以根据需要多次调用/api/Validations,但这个问题仍然存在,因为这个项目需要 Mongoose。

最佳答案

取而代之的是:

return function (err, results) {
            if (err) {
                next(err);
            } else {
                // Prevent browser from caching results of API data requests
                //res.setHeader('Cache-Control', 'no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0');
                //res.setHeader("Content-Type:", "application/json");
                res.send(JSON.stringify(results));
            }
            res.end();
        }

使用这个

return function (err, results) {
            if (err) {
                next(err);
            } else {
                // Prevent browser from caching results of API data requests
                //res.setHeader('Cache-Control', 'no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0');
                //res.setHeader("Content-Type:", "application/json");
                res.end(JSON.stringify(results));                    
            }

    }

关于node.js - NodeJS/Express/Mongoose 发送后报错Can't set headers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26604619/

有关node.js - NodeJS/Express/Mongoose 发送后报错Can't set headers的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  3. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  4. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  5. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  6. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  7. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  8. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  9. ruby-on-rails - Rails 中的 NoMethodError::MailersController#preview undefined method `activation_token=' for nil:NilClass - 2

    似乎无法为此找到有效的答案。我正在阅读Rails教程的第10章第10.1.2节,但似乎无法使邮件程序预览正常工作。我发现处理错误的所有答案都与教程的不同部分相关,我假设我犯的错误正盯着我的脸。我已经完成并将教程中的代码复制/粘贴到相关文件中,但到目前为止,我还看不出我输入的内容与教程中的内容有什么区别。到目前为止,建议是在函数定义中添加或删除参数user,但这并没有解决问题。触发错误的url是http://localhost:3000/rails/mailers/user_mailer/account_activation.http://localhost:3000/rails/mai

  10. ruby CSV : How can I read a tab-delimited file? - 2

    CSV.open(name,"r").eachdo|row|putsrowend我得到以下错误:CSV::MalformedCSVErrorUnquotedfieldsdonotallow\ror\n文件名是一个.txt制表符分隔文件。我是专门做的。我有一个.csv文件,我转到excel,并将文件保存为.txt制表符分隔的文件。所以它是制表符分隔的。CSV.open不应该能够读取制表符分隔的文件吗? 最佳答案 尝试像这样指定字段分隔符:CSV.open("name","r",{:col_sep=>"\t"}).eachdo|row|

随机推荐