Problemas para publicar datos JSON (con solicitud de nodo) en el servidor Express para guardar en MongoDB

Uso MongoDB como la base de datos de back-end para mi nodo / aplicación Express. Para resumir el problema que estoy enfrentando, no sé cómo configurar el analizador de cuerpo en mi aplicación Express, porque la aplicación del lado del servidor no recibe el JSON completo publicado por la aplicación cliente (también una aplicación node.js ) En su mayor parte, el cliente envía JSON en el cuerpo de la solicitud a puntos finales RESTful. La excepción es un caso único en el que se debe cargar un archivo y, dado que es un cuerpo multiparte, estoy usandosolicitud ydatos de formulario para construir ese tipo de solicitud y usarmulter en el lado del servidor para procesar la solicitud de varias partes, ya que body-parser no procesa tales solicitudes.

En el lado del servidor (Express), tengo la siguiente configuración de la aplicación Express:

let app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

En el cliente de nodo, estoy usando el siguiente código para construir un objeto JavaScript de estilo JSON y publicarlo en un punto final RESTful:

Tengo dificultades para redactar la solicitud del lado del cliente, consolicitud de nodo:

// class is a JavaScript/JSON object within scope of this code
let req = request.post({
  //headers: { 'Content-Type': 'application/json' },
  url: 'http://localhost:3000/classes',
  //form: class
  form: JSON.stringify(class)
}, function (err, resp, body) {
  if (err) {
    throw err;
  }
});

Tenga en cuenta que intenté varias versiones del código anterior especificando explícitamente el tipo de contenido comoapplication/JSON, además de usarJSON.stringify para convertir el objeto JavaScript en una cadena JSON. La colección MongoDB (class) almacena el siguiente tipo de documento, que contienellaves extranjeras a otras dos colecciones (subject ystudent):

{
  "_id" : ObjectId("57758f15f68da08c254ebee1"),
  "name" : "Grade 5 - Section A",
  "scores" : [{
    "studentId" : ObjectId("5776bd36ffc8227405d364d2"),
    "performance": [{
      "subjectId" : ObjectId("577694ecbf6f3a781759c54a"),
      "score" : 86,
      "maximum" : 100,
      "grade" : "B+"
    }]
  }]
}

En los registros del servidor, veo el siguiente error:

Tue, 05 Jul 2016 04:34:46 GMT classReportApp:routes:classes class received from client: { _id: 577b38e65967097c25876764, scores: [] }
RangeError: Invalid status code: 0
    at ServerResponse.writeHead (_http_server.js:192:11)
    at ServerResponse.writeHead (C:\Development\classReportApp\node_modules\morgan\node_modules\on-headers\index.js:55:19)
    at ServerResponse._implicitHeader (_http_server.js:157:8)
    at ServerResponse.OutgoingMessage.end (_http_outgoing.js:566:10)
    at ServerResponse.send (C:\Development\classReportApp\node_modules\express\lib\response.js:205:10)
    at ServerResponse.json (C:\Development\classReportApp\node_modules\express\lib\response.js:250:15)
    at C:\Development\classReportApp\server-process\app.js:80:26
    at Layer.handle_error (C:\Development\classReportApp\node_modules\express\lib\router\layer.js:71:5)
    at trim_prefix (C:\Development\classReportApp\node_modules\express\lib\router\index.js:310:13)
    at C:\Development\classReportApp\node_modules\express\lib\router\index.js:280:7
    at Function.process_params (C:\Development\classReportApp\node_modules\express\lib\router\index.js:330:12)

lo cual es extraño porquepuntuaciones La matriz de subdocumentos está vacía (scores: []), mientras que en el lado del cliente, estoy enviando una matriz no vacía con elementos de rendimiento de algunos estudiantes.

¿He violado la forma correcta de publicar JSON en aplicaciones Express? ¿Cómo puedo solucionar esto?

Editado: 5/7/2016 Cambié la configuración del middleware del analizador del cuerpo para usarextended: true en lugar.

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

El node.js todavía está utilizando elsolicitud de nodo módulo para componer y enviar la solicitud POST, utilizando el siguiente código:

let req = request({
  url: 'http://localhost:3000/classes',
  method: 'POST',
  json: class
}, function (err, resp, body) {
  if (err) {
    throw err;
  }
  else {
    // process response
  }
});

Esto funciona ahora, pero lo que me confunde es que, dado que el tipo de contenido es application / json, ¿cómo funciona elbodyParser.urlencoded({ extended: true }) (o falso) materia?

Respuestas a la pregunta(1)

Su respuesta a la pregunta