2017-10-31 3 views
0

AKTUALISIERT:richtigen Weg mit async, double dann() in Versprechen? node8, muss wirklich zu es5 babel?

die Frage über Konsole stringify ist dupliziert; so habe ich meine Frage zu einem anderen mit Asynchron geändert, weil die ecode sam ist

ich eine Asynchron-Funktion, die einen Datensatz throug sequelize ORM bekommen, warum

Meine Frage ist

const genericResolver = async (table, action , values) => { 

    resultValues = {}; 
    let resultValues = await models[table].findById(values.id).then(function (data) { 
     console.log(' ************** data'); 
     console.log(data); 
     return data; 
    }).then(function (data2) { 
     console.log(' ************** data 2'); 
     console.log(data2); 
     } 
    ); 
    console.log('------ resultValues'); 
    console.log(resultValues); 
    process.exit(1); 

for data and data2 I get: 

    tour { 
     dataValues: 
     { id: 'd61802ff-3eec-4a72-97ca-832f51b96bf0', 
     name: 'Chipre 2018', 
     price: '1400.00', 
     createdAt: 2017-09-05T04:01:27.642Z, 
     updatedAt: 2017-10-31T11:29:39.484Z }, 
     _previousDataValues: 
     { id: 'd61802ff-3eec-4a72-97ca-832f51b96bf0', 
     name: 'Chipre 2018', 
     price: '1400.00', 
     createdAt: 2017-09-05T04:01:27.642Z, 
     updatedAt: 2017-10-31T11:29:39.484Z }, 
     _changed: {}, 
     _modelOptions: 
     { timestamps: true, 
     validate: {}, 
     freezeTableName: true, 
     underscored: false, 
     underscoredAll: false, 
     paranoid: false, 
     rejectOnEmpty: false, 
     whereCollection: { id: 'd61802ff-3eec-4a72-97ca-832f51b96bf0' }, 
     schema: null, 
     schemaDelimiter: '', 
     defaultScope: {}, 
     scopes: [], 
     hooks: {}, 
     indexes: [], 
     name: { plural: 'tour', singular: 'tour' }, 
     omitNull: false, 
     sequelize: 
      Sequelize { 
      options: [Object], 
      config: [Object], 
      dialect: [Object], 
      queryInterface: [Object], 
      models: [Object], 
      modelManager: [Object], 
      connectionManager: [Object], 
      importCache: {}, 
      test: [Object] }, 
     uniqueKeys: {} }, 
     _options: 
     { isNewRecord: false, 
     _schema: null, 
     _schemaDelimiter: '', 
     raw: true, 
     attributes: 
      [ 'id', 
      'name', 
      'price', 
      'seatsmax', 
      'createdAt', 
      'updatedAt' ] }, 
     __eagerlyLoadedAssociations: [], 
     isNewRecord: false } 

aber für 'resultValues' ich:

undefined 

ich rechts mit Asynchron tun? Ich benutze node8, also brauche ich in der Theorie nicht alles in ES5 konvertieren? einfach importieren oder exportieren? Ich vermute, dass babel schafft ES6 Code

Hier mein package.json

{ 
    "name": "myproj", 
    "version": "1.0.0", 
    "description": "GraphQL server", 
    "main": "server.js", 
    "scripts": { 
    "start": "nodemon ./server.js --exec babel-node -e js", 
    "test": "eslint . --ext .js --ext .jsx --ignore-path .gitignore --cache" 
    }, 
    "author": "", 
    "license": "MIT", 
    "devDependencies": { 
    "babel-cli": "^6.24.0", 
    "babel-eslint": "^8.0.0", 
    "babel-preset-es2015": "^6.24.0", 
    "babel-preset-stage-0": "^6.22.0", 
    "eslint": "^4.7.1", 
    "eslint-plugin-react": "^7.3.0", 
    "nodemon": "^1.11.0" 
    }, 
    "dependencies": { 
    "bcrypt-nodejs": "0.0.3", 
    "body-parser": "^1.17.1", 
    "cors": "^2.8.3", 
    "dotenv": "^4.0.0", 
    "express": "^4.15.2", 
    "graphql": "^0.9.1", 
    "graphql-server-express": "^0.6.0", 
    "graphql-tools": "^0.10.1", 
    "jsonwebtoken": "^7.2.1", 
    "lodash": "^4.17.4", 
    "passport": "^0.4.0", 
    "passport-jwt": "^3.0.0", 
    "pg": "^7.2.0", 
    "sequelize": "", 
    "validator": "^6.2.0" 
    } 
} 
+0

Mögliche Duplikat [How macht die Sequelize POJO JSON.Stringify magische Arbeit?] (https://StackOverflow.com/questions/41747844/how-does-the-sequelize-pojo-json-stringify-magic-work) – Asthmatic

Antwort

2

Dies liegt daran, Objekte als Referenz in JS übergeben werden, so dass, wenn Sie console.log(o) tun, werden Sie den aktuellen Wert in der Konsole (siehe nicht der Wert, den Sie beim Aufruf von console.log übergeben haben).

Wenn Sie JSON.stringify verwenden, protokollieren Sie die Zeichenfolge, die als Wert übergeben wird. Wenn Sie also JSON verwenden, sehen Sie den Wert zum Zeitpunkt des Aufrufs von console.log.

EDIT

In Bezug auf Ihre neue Frage, ist Problem, dass Sie nicht data2 aus dem zweiten then Rückruf kehren. Wenn async/await verwenden, brauchen Sie nicht then überhaupt zu benutzen:

const data = await models[table].findById(values.id); 

Oder wenn Sie wollen, nur data2 zurückkehren und Sie sollten das gleiche Ergebnis in resultValues sehen:

let resultValues = await models[table].findById(values.id).then(data => { 
    console.log(' ************** data'); 
    console.log(data); 
    return data; 
}).then(data2 => { 
    console.log(' ************** data 2'); 
    console.log(data2); 

    return data2; // <== return here 
}); 

console.log('------ resultValues'); 
console.log(resultValues); 
+0

das echte ist console.log (o) dann? gibt es eine Möglichkeit, denselben Wert mit einer Technik zu erhalten? – DDave

+0

was ich nicht verstehe von wo kommt der Wert in stringfy? Ich habe diesen Wert nicht geändert ich denke – DDave

+0

Nein, der tatsächliche Wert wird nur bei Verwendung von JSON beibehalten. Problem ist nicht mit 'console.log', aber mit Ihrem Code - Sie erwarten dort einige Eigenschaften, zu der Zeit, wenn noch nicht zugewiesen sind. Sie ordnen sie wahrscheinlich später zu (dies kann an anderer Stelle als der von Ihnen verwendeten Datei passieren). –

Verwandte Themen