2017-05-09 7 views
0

私はgraphqlとノードを使い慣れていません。これは本当にシンプルですが、mysqlクエリを実行しようとしています。クライアントから読み込みます。私が実行している問題は、node-mysqlが非同期にクエリを実行するため、クエリ応答を直接取得できないことです。私はそれを考え出したいくつかの工夫の後node-mysqlのgraphqlリゾルバ関数のmysqlクエリを返します。

、新しいコード:ここで

var root = { 
    login: function({username, password}) { 
     var s = `select password from users where username='${username}'`; 
     var result = sql.query(s); 
     return result.then(response => { 
      return password == response[0].password 
     }); 
} 

はGraphqlが今応答が定義されていないことを返すsql.query

exports.query = function(s, callback) { 
    var promise = new Promise((resolve, reject) => { 
     con.query(s, function(err, response) { 
      if (err) throw err; 
      resolve(response); 
    }); 
}); 
return promise; 

ための関数定義です。

答えて

1

私は個人的にmysqlを使用しますが、それほど大きな違いはありません。

だから私はこのようにそれを行う:

exports.getUser = ({ id }) => { 
    return new Promise((resolve, reject) => { 
    let sql = `select * from users u where u.user_id = ?`; 
    sql = mysql.format(sql, [id]); 
    connection.query(sql, (err, results) => { 
     if (err) reject(err); 
     resolve(results); 
    }); 
    }); 
}; 

は、クエリが実行されたときに解決の約束、周りのクエリを包みます。

フィールドの解決では、約束の上に.thenを呼び出して、何でもしてください。

const viewerType = new GraphQLObjectType({ 
    name: 'Viewer', 
    fields:() => ({ 
    user: { 
     type: userType, 
     args: { 
     id: { 
      type: GraphQLInt, 
     }, 
     }, 
     resolve: (rootValue, args) => { 
     return getUser({ id: args.id }).then(value => value[0]); 
     }, 
    }, 
    }), 
}); 
+0

私のコードがあなたのやり方を更新しました。そして、graphqlは応答が定義されていないことを示しています。また、あなたが解決関数をどのように定義したかと私のやり方との間には違いがありますか?私は自分のコードのどこにでも 'GraphQLObjectType'のインスタンスを持っていません。 – MacStation

+1

あなたの '.then'は正しく戻っていません。おそらく '.then((response)=> password == response [0] .password); ' – wednesdaymiko

+0

うん、ちょうどそれを固定しました、ありがとう!ちなみに、リゾルバをどのように定義したのか、どうやってそれをしたのかはどうですか?それは問題ですか? – MacStation

関連する問題