Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs Can';t在发送后设置标题-通过NodeJs发布新用户_Angularjs_Node.js_Mongodb_Express_Mongoose - Fatal编程技术网

Angularjs Can';t在发送后设置标题-通过NodeJs发布新用户

Angularjs Can';t在发送后设置标题-通过NodeJs发布新用户,angularjs,node.js,mongodb,express,mongoose,Angularjs,Node.js,Mongodb,Express,Mongoose,我正在尝试使用googlemapsapi、NodeJs、Express、MongoDB、Mongoose和AngularJS构建一个应用程序,而我面临的一个问题是,我无法通过查看其他相关的SO Q/a来解决 基本上,我正试图将发布到我的数据库用户中,这些用户由用户名和[纬度,经度]标识,他们提交了我视图中的某个表单 当我尝试直接从应用程序(如Postman中发布用户时,一切正常,我可以在数据库中看到新用户 相反,当我尝试在用户提交时直接发布他们时,我会在我的控制台中得到以下错误: /node_m

我正在尝试使用googlemapsapiNodeJsExpressMongoDBMongooseAngularJS构建一个应用程序,而我面临的一个问题是,我无法通过查看其他相关的SO Q/a来解决

基本上,我正试图
发布到我的数据库用户中,这些用户由
用户名
[纬度,经度]
标识,他们提交了我视图中的某个表单

当我尝试直接从应用程序(如Postman中发布
用户时,一切正常,我可以在数据库中看到新用户

相反,当我尝试在用户提交时直接发布他们时,我会在我的控制台中得到以下错误:

/node_modules/mongodb-core/lib/topologies/server.js:766
  catch(err) { process.nextTick(function() { throw err}); }
                                             ^
Error: Can't set headers after they are sent.
angular.js:10695 GET http://localhost:3000/users net::ERR_CONNECTION_REFUSED
<form name="addForm" novalidate>
  <div class="form-group">
       <label for="username">Username
          <span class="badge">All fields required</span>
       </label>
       <input type="text" class="form-control" id="username" 
              placeholder="OldandGold" ng-model="formData.username" required>
   </div>
   <div class="form-group">
      <label for="latitude">Latitude</label>
        <input type="text" class="form-control" id="latitude" 
               value="39.500" ng-model="formData.latitude" readonly>
   </div>
   <div class="form-group">
     <label for="longitude">Longitude</label>
        <input type="text" class="form-control" id="longitude" 
               value="-98.350" ng-model="formData.longitude" readonly>
   </div>

   <button type="submit" class="btn btn-danger btn-block" 
           ng-click="createUser()" ng-disabled="addForm.$invalid">Submit</button>
</form>
// Pulls Mongoose dependency for creating schemas
var mongoose = require('mongoose');
var GeoJSON  = require('geojson');
var Schema   = mongoose.Schema;

var LocationSchema = new Schema({
                                    name: {type: String, required: true},
                                    location: {
                                      type: {type : String, required: true},
                                      coordinates : [Schema.Types.Mixed]
                                    },
                                    created_at: {type: Date, default: Date.now},
                                    updated_at: {type: Date, default: Date.now}
});

// Sets the created_at parameter equal to the current time
LocationSchema.pre('save', function(next){
    now = new Date();
    this.updated_at = now;
    if(!this.created_at) {
        this.created_at = now
    }
    next();
});

// Indexes this schema in 2dsphere format (critical for running proximity searches)
LocationSchema.index({location: '2dsphere'});

module.exports = mongoose.model('mean-locations', LocationSchema);
$scope.createUser = function($rootScope, $on) {
        // Grabs all of the text box fields
        var userData = {
            name: $scope.formData.username,
            location: {
                        type: "Point",
                        coordinates: [$scope.formData.latitude, 
                                      $scope.formData.longitude]
            }
        };

        console.log(JSON.stringify(userData));

    // Saves the user data to the db
    $http.post('/users', userData)
        .success(function(data) {

            // Once complete, clear the form (except location)
            $scope.formData.username = "";

        })
        .error(function(data) {
            console.log('Error: ' + data);
        });
};
app.get('/users', function(req, res) {

        // Uses Mongoose schema to run the search (empty conditions)
        var query = User.find({});
        query.exec(function(err, users) {
            if (err)
                res.send(err);

            // If no errors are found, it responds with a JSON of all users
            res.json(users);
        });
});

    // POST Routes
    // --------------------------------------------------------
    // Provides method for saving new users in the db
    app.post('/users', function(req, res) {

        // Creates a new User based on the Mongoose schema and the post body
        var newuser = new User(req.body);

        // New User is saved in the db.
        newuser.save(function(err) {
            if (err)
                res.send(err);

            // If no errors are found, it responds with a JSON of the new user
            res.json(req.body);
        });
    });
以及我的谷歌浏览器控制台中的以下日志:

/node_modules/mongodb-core/lib/topologies/server.js:766
  catch(err) { process.nextTick(function() { throw err}); }
                                             ^
Error: Can't set headers after they are sent.
angular.js:10695 GET http://localhost:3000/users net::ERR_CONNECTION_REFUSED
<form name="addForm" novalidate>
  <div class="form-group">
       <label for="username">Username
          <span class="badge">All fields required</span>
       </label>
       <input type="text" class="form-control" id="username" 
              placeholder="OldandGold" ng-model="formData.username" required>
   </div>
   <div class="form-group">
      <label for="latitude">Latitude</label>
        <input type="text" class="form-control" id="latitude" 
               value="39.500" ng-model="formData.latitude" readonly>
   </div>
   <div class="form-group">
     <label for="longitude">Longitude</label>
        <input type="text" class="form-control" id="longitude" 
               value="-98.350" ng-model="formData.longitude" readonly>
   </div>

   <button type="submit" class="btn btn-danger btn-block" 
           ng-click="createUser()" ng-disabled="addForm.$invalid">Submit</button>
</form>
// Pulls Mongoose dependency for creating schemas
var mongoose = require('mongoose');
var GeoJSON  = require('geojson');
var Schema   = mongoose.Schema;

var LocationSchema = new Schema({
                                    name: {type: String, required: true},
                                    location: {
                                      type: {type : String, required: true},
                                      coordinates : [Schema.Types.Mixed]
                                    },
                                    created_at: {type: Date, default: Date.now},
                                    updated_at: {type: Date, default: Date.now}
});

// Sets the created_at parameter equal to the current time
LocationSchema.pre('save', function(next){
    now = new Date();
    this.updated_at = now;
    if(!this.created_at) {
        this.created_at = now
    }
    next();
});

// Indexes this schema in 2dsphere format (critical for running proximity searches)
LocationSchema.index({location: '2dsphere'});

module.exports = mongoose.model('mean-locations', LocationSchema);
$scope.createUser = function($rootScope, $on) {
        // Grabs all of the text box fields
        var userData = {
            name: $scope.formData.username,
            location: {
                        type: "Point",
                        coordinates: [$scope.formData.latitude, 
                                      $scope.formData.longitude]
            }
        };

        console.log(JSON.stringify(userData));

    // Saves the user data to the db
    $http.post('/users', userData)
        .success(function(data) {

            // Once complete, clear the form (except location)
            $scope.formData.username = "";

        })
        .error(function(data) {
            console.log('Error: ' + data);
        });
};
app.get('/users', function(req, res) {

        // Uses Mongoose schema to run the search (empty conditions)
        var query = User.find({});
        query.exec(function(err, users) {
            if (err)
                res.send(err);

            // If no errors are found, it responds with a JSON of all users
            res.json(users);
        });
});

    // POST Routes
    // --------------------------------------------------------
    // Provides method for saving new users in the db
    app.post('/users', function(req, res) {

        // Creates a new User based on the Mongoose schema and the post body
        var newuser = new User(req.body);

        // New User is saved in the db.
        newuser.save(function(err) {
            if (err)
                res.send(err);

            // If no errors are found, it responds with a JSON of the new user
            res.json(req.body);
        });
    });
这是我的视图

/node_modules/mongodb-core/lib/topologies/server.js:766
  catch(err) { process.nextTick(function() { throw err}); }
                                             ^
Error: Can't set headers after they are sent.
angular.js:10695 GET http://localhost:3000/users net::ERR_CONNECTION_REFUSED
<form name="addForm" novalidate>
  <div class="form-group">
       <label for="username">Username
          <span class="badge">All fields required</span>
       </label>
       <input type="text" class="form-control" id="username" 
              placeholder="OldandGold" ng-model="formData.username" required>
   </div>
   <div class="form-group">
      <label for="latitude">Latitude</label>
        <input type="text" class="form-control" id="latitude" 
               value="39.500" ng-model="formData.latitude" readonly>
   </div>
   <div class="form-group">
     <label for="longitude">Longitude</label>
        <input type="text" class="form-control" id="longitude" 
               value="-98.350" ng-model="formData.longitude" readonly>
   </div>

   <button type="submit" class="btn btn-danger btn-block" 
           ng-click="createUser()" ng-disabled="addForm.$invalid">Submit</button>
</form>
// Pulls Mongoose dependency for creating schemas
var mongoose = require('mongoose');
var GeoJSON  = require('geojson');
var Schema   = mongoose.Schema;

var LocationSchema = new Schema({
                                    name: {type: String, required: true},
                                    location: {
                                      type: {type : String, required: true},
                                      coordinates : [Schema.Types.Mixed]
                                    },
                                    created_at: {type: Date, default: Date.now},
                                    updated_at: {type: Date, default: Date.now}
});

// Sets the created_at parameter equal to the current time
LocationSchema.pre('save', function(next){
    now = new Date();
    this.updated_at = now;
    if(!this.created_at) {
        this.created_at = now
    }
    next();
});

// Indexes this schema in 2dsphere format (critical for running proximity searches)
LocationSchema.index({location: '2dsphere'});

module.exports = mongoose.model('mean-locations', LocationSchema);
$scope.createUser = function($rootScope, $on) {
        // Grabs all of the text box fields
        var userData = {
            name: $scope.formData.username,
            location: {
                        type: "Point",
                        coordinates: [$scope.formData.latitude, 
                                      $scope.formData.longitude]
            }
        };

        console.log(JSON.stringify(userData));

    // Saves the user data to the db
    $http.post('/users', userData)
        .success(function(data) {

            // Once complete, clear the form (except location)
            $scope.formData.username = "";

        })
        .error(function(data) {
            console.log('Error: ' + data);
        });
};
app.get('/users', function(req, res) {

        // Uses Mongoose schema to run the search (empty conditions)
        var query = User.find({});
        query.exec(function(err, users) {
            if (err)
                res.send(err);

            // If no errors are found, it responds with a JSON of all users
            res.json(users);
        });
});

    // POST Routes
    // --------------------------------------------------------
    // Provides method for saving new users in the db
    app.post('/users', function(req, res) {

        // Creates a new User based on the Mongoose schema and the post body
        var newuser = new User(req.body);

        // New User is saved in the db.
        newuser.save(function(err) {
            if (err)
                res.send(err);

            // If no errors are found, it responds with a JSON of the new user
            res.json(req.body);
        });
    });
这是我的控制器的createUser函数

/node_modules/mongodb-core/lib/topologies/server.js:766
  catch(err) { process.nextTick(function() { throw err}); }
                                             ^
Error: Can't set headers after they are sent.
angular.js:10695 GET http://localhost:3000/users net::ERR_CONNECTION_REFUSED
<form name="addForm" novalidate>
  <div class="form-group">
       <label for="username">Username
          <span class="badge">All fields required</span>
       </label>
       <input type="text" class="form-control" id="username" 
              placeholder="OldandGold" ng-model="formData.username" required>
   </div>
   <div class="form-group">
      <label for="latitude">Latitude</label>
        <input type="text" class="form-control" id="latitude" 
               value="39.500" ng-model="formData.latitude" readonly>
   </div>
   <div class="form-group">
     <label for="longitude">Longitude</label>
        <input type="text" class="form-control" id="longitude" 
               value="-98.350" ng-model="formData.longitude" readonly>
   </div>

   <button type="submit" class="btn btn-danger btn-block" 
           ng-click="createUser()" ng-disabled="addForm.$invalid">Submit</button>
</form>
// Pulls Mongoose dependency for creating schemas
var mongoose = require('mongoose');
var GeoJSON  = require('geojson');
var Schema   = mongoose.Schema;

var LocationSchema = new Schema({
                                    name: {type: String, required: true},
                                    location: {
                                      type: {type : String, required: true},
                                      coordinates : [Schema.Types.Mixed]
                                    },
                                    created_at: {type: Date, default: Date.now},
                                    updated_at: {type: Date, default: Date.now}
});

// Sets the created_at parameter equal to the current time
LocationSchema.pre('save', function(next){
    now = new Date();
    this.updated_at = now;
    if(!this.created_at) {
        this.created_at = now
    }
    next();
});

// Indexes this schema in 2dsphere format (critical for running proximity searches)
LocationSchema.index({location: '2dsphere'});

module.exports = mongoose.model('mean-locations', LocationSchema);
$scope.createUser = function($rootScope, $on) {
        // Grabs all of the text box fields
        var userData = {
            name: $scope.formData.username,
            location: {
                        type: "Point",
                        coordinates: [$scope.formData.latitude, 
                                      $scope.formData.longitude]
            }
        };

        console.log(JSON.stringify(userData));

    // Saves the user data to the db
    $http.post('/users', userData)
        .success(function(data) {

            // Once complete, clear the form (except location)
            $scope.formData.username = "";

        })
        .error(function(data) {
            console.log('Error: ' + data);
        });
};
app.get('/users', function(req, res) {

        // Uses Mongoose schema to run the search (empty conditions)
        var query = User.find({});
        query.exec(function(err, users) {
            if (err)
                res.send(err);

            // If no errors are found, it responds with a JSON of all users
            res.json(users);
        });
});

    // POST Routes
    // --------------------------------------------------------
    // Provides method for saving new users in the db
    app.post('/users', function(req, res) {

        // Creates a new User based on the Mongoose schema and the post body
        var newuser = new User(req.body);

        // New User is saved in the db.
        newuser.save(function(err) {
            if (err)
                res.send(err);

            // If no errors are found, it responds with a JSON of the new user
            res.json(req.body);
        });
    });
最后,这里是我的路线:

/node_modules/mongodb-core/lib/topologies/server.js:766
  catch(err) { process.nextTick(function() { throw err}); }
                                             ^
Error: Can't set headers after they are sent.
angular.js:10695 GET http://localhost:3000/users net::ERR_CONNECTION_REFUSED
<form name="addForm" novalidate>
  <div class="form-group">
       <label for="username">Username
          <span class="badge">All fields required</span>
       </label>
       <input type="text" class="form-control" id="username" 
              placeholder="OldandGold" ng-model="formData.username" required>
   </div>
   <div class="form-group">
      <label for="latitude">Latitude</label>
        <input type="text" class="form-control" id="latitude" 
               value="39.500" ng-model="formData.latitude" readonly>
   </div>
   <div class="form-group">
     <label for="longitude">Longitude</label>
        <input type="text" class="form-control" id="longitude" 
               value="-98.350" ng-model="formData.longitude" readonly>
   </div>

   <button type="submit" class="btn btn-danger btn-block" 
           ng-click="createUser()" ng-disabled="addForm.$invalid">Submit</button>
</form>
// Pulls Mongoose dependency for creating schemas
var mongoose = require('mongoose');
var GeoJSON  = require('geojson');
var Schema   = mongoose.Schema;

var LocationSchema = new Schema({
                                    name: {type: String, required: true},
                                    location: {
                                      type: {type : String, required: true},
                                      coordinates : [Schema.Types.Mixed]
                                    },
                                    created_at: {type: Date, default: Date.now},
                                    updated_at: {type: Date, default: Date.now}
});

// Sets the created_at parameter equal to the current time
LocationSchema.pre('save', function(next){
    now = new Date();
    this.updated_at = now;
    if(!this.created_at) {
        this.created_at = now
    }
    next();
});

// Indexes this schema in 2dsphere format (critical for running proximity searches)
LocationSchema.index({location: '2dsphere'});

module.exports = mongoose.model('mean-locations', LocationSchema);
$scope.createUser = function($rootScope, $on) {
        // Grabs all of the text box fields
        var userData = {
            name: $scope.formData.username,
            location: {
                        type: "Point",
                        coordinates: [$scope.formData.latitude, 
                                      $scope.formData.longitude]
            }
        };

        console.log(JSON.stringify(userData));

    // Saves the user data to the db
    $http.post('/users', userData)
        .success(function(data) {

            // Once complete, clear the form (except location)
            $scope.formData.username = "";

        })
        .error(function(data) {
            console.log('Error: ' + data);
        });
};
app.get('/users', function(req, res) {

        // Uses Mongoose schema to run the search (empty conditions)
        var query = User.find({});
        query.exec(function(err, users) {
            if (err)
                res.send(err);

            // If no errors are found, it responds with a JSON of all users
            res.json(users);
        });
});

    // POST Routes
    // --------------------------------------------------------
    // Provides method for saving new users in the db
    app.post('/users', function(req, res) {

        // Creates a new User based on the Mongoose schema and the post body
        var newuser = new User(req.body);

        // New User is saved in the db.
        newuser.save(function(err) {
            if (err)
                res.send(err);

            // If no errors are found, it responds with a JSON of the new user
            res.json(req.body);
        });
    });
使用我的
Stringify日志
我可以看到一个合适的json:

{"name":"MyPoint","location":{"type":"Point","coordinates":["50.064","16.260"]}}
我对NodeJs还很陌生,我不明白为什么这种情况一直发生

这是什么原因造成的?如何解决此问题?


提前感谢。

问题就在这里,如果出现错误,您必须停止执行。(注意返回)。例如,如果有错误,您的代码将发送(res.send)错误并继续执行
res.json()
它将以您提到的错误结束,因为您已经设置了头并发送了响应

    newuser.save(function(err) {
        if (err)
            return res.send(err);

        // If no errors are found, it responds with a JSON of the new user
        res.json(req.body);
    });

问题在于,如果出现错误,您必须停止执行。(注意返回)。例如,如果有错误,您的代码将发送(res.send)错误并继续执行
res.json()
它将以您提到的错误结束,因为您已经设置了头并发送了响应

    newuser.save(function(err) {
        if (err)
            return res.send(err);

        // If no errors are found, it responds with a JSON of the new user
        res.json(req.body);
    });
“错误:发送邮件后无法设置邮件头。”错误通常表示您正在发送多个响应(使用express)

例如,如果出现错误,此代码将(尝试)发送两个响应

app.get('/users', function(req, res) {

    // Uses Mongoose schema to run the search (empty conditions)
    var query = User.find({});
    query.exec(function(err, users) {
        if (err)
            res.send(err); // first response

        // If no errors are found, it responds with a JSON of all users
        res.json(users); // second response
    });
});
要解决此问题,请确保在发送响应后退出:

app.get('/users', function(req, res) {

    // Uses Mongoose schema to run the search (empty conditions)
    var query = User.find({});
    query.exec(function(err, users) {
        if (err) {
            res.send(err);
            return; // return here!
        }

        // If no errors are found, it responds with a JSON of all users
        res.json(users);
    });
});
“错误:发送邮件后无法设置邮件头。”错误通常表示您正在发送多个响应(使用express)

例如,如果出现错误,此代码将(尝试)发送两个响应

app.get('/users', function(req, res) {

    // Uses Mongoose schema to run the search (empty conditions)
    var query = User.find({});
    query.exec(function(err, users) {
        if (err)
            res.send(err); // first response

        // If no errors are found, it responds with a JSON of all users
        res.json(users); // second response
    });
});
要解决此问题,请确保在发送响应后退出:

app.get('/users', function(req, res) {

    // Uses Mongoose schema to run the search (empty conditions)
    var query = User.find({});
    query.exec(function(err, users) {
        if (err) {
            res.send(err);
            return; // return here!
        }

        // If no errors are found, it responds with a JSON of all users
        res.json(users);
    });
});

谢谢你的回答。我不再收到错误,但它似乎没有将新创建的用户保存到数据库中。知道吗?试着记录错误。如果出现错误,将不保存用户。你也必须对app.get('/users',…)执行同样的操作;完全没有错误。当我用postman发布同一个用户时,一切正常。Hmmm。在这种情况下,这可能是一个问题,可能是由于你的角度代码,我不是很熟悉。我建议你用这个问题开始一个新问题。谢谢你的回答。我不再收到错误,但它似乎没有将新创建的用户保存到数据库中。知道吗?试着记录错误。如果出现错误,将不保存用户。你也必须对app.get('/users',…)执行同样的操作;完全没有错误。当我用postman发布同一个用户时,一切正常。Hmmm。在这种情况下,这可能是一个问题,可能是由于你的角度代码,我不是很熟悉。我建议你用这个问题开始一个新问题。谢谢你的回答。我不再收到错误,但它似乎没有将新创建的用户保存到数据库中。有什么想法吗?你能试着缩小误差吗。。。可能是post user Hander中的spray console.log。请在此处查看,谢谢您的回答。我不再收到错误,但它似乎没有将新创建的用户保存到数据库中。有什么想法吗?你能试着缩小误差吗。。。可能是post user Hander中的spray console.log。请查看此处