Просмотр исходного кода

use text/plain on /api/metrics

Danny Coates 6 лет назад
Родитель
Сommit
8eaacfea18
4 измененных файлов с 11 добавлено и 5 удалено
  1. 6 2
      app/metrics.js
  2. 1 0
      package.json
  3. 3 2
      server/routes/index.js
  4. 1 1
      server/routes/metrics.js

+ 6 - 2
app/metrics.js

@@ -41,13 +41,17 @@ function submitEvents() {
         events
       })
     ],
-    { type: 'application/json' }
+    { type: 'text/plain' } // see http://crbug.com/490015
   );
   events.splice(0);
   if (!navigator.sendBeacon) {
     return;
   }
-  navigator.sendBeacon('/api/metrics', data);
+  try {
+    navigator.sendBeacon('/api/metrics', data);
+  } catch (e) {
+    console.error(e);
+  }
 }
 
 async function addEvent(event_type, event_properties) {

+ 1 - 0
package.json

@@ -136,6 +136,7 @@
   "dependencies": {
     "@google-cloud/storage": "^2.4.2",
     "aws-sdk": "^2.400.0",
+    "body-parser": "^1.18.3",
     "choo": "^6.12.1",
     "cldr-core": "^34.0.0",
     "convict": "^4.4.1",

+ 3 - 2
server/routes/index.js

@@ -1,5 +1,5 @@
 const crypto = require('crypto');
-const express = require('express');
+const bodyParser = require('body-parser');
 const helmet = require('helmet');
 const uaparser = require('ua-parser-js');
 const storage = require('../storage');
@@ -69,7 +69,8 @@ module.exports = function(app) {
     res.set('Cache-Control', 'no-cache');
     next();
   });
-  app.use(express.json());
+  app.use(bodyParser.json());
+  app.use(bodyParser.text());
   app.get('/', language, pages.index);
   app.get('/oauth', language, pages.blank);
   app.get('/legal', language, pages.legal);

+ 1 - 1
server/routes/metrics.js

@@ -2,7 +2,7 @@ const { sendBatch, clientEvent } = require('../amplitude');
 
 module.exports = async function(req, res) {
   try {
-    const data = req.body;
+    const data = JSON.parse(req.body); // see http://crbug.com/490015
     const deltaT = Date.now() - data.now;
     const events = data.events.map(e =>
       clientEvent(