2017-05-03 288 views
0

我写了一个查询,让我的职位从表中还返回有关每个帖子的作者的信息的结果:MySQL查询返回一个字符串如JSON_OBJECT()

SELECT post.id, post.text, post.datetime, JSON_OBJECT(
       'username', user.username, 
       'firstName', user.firstName, 
       'firstName', user.lastName) as author 
       FROM post 
       INNER JOIN user ON post.authorId = user.id; 

但响应的author场的字符串:

author: "{"username": "@", "firstName": null}" 
datetime: "2017-05-02T20:23:23.000Z" 
id: 10 
text: "5555" 

我试图修复使用CAST但无论如何author是一个字符串:

CAST(JSON_OBJECT(
    'username', user.username, 
    'firstName', user.firstName, 
    'firstName', user.lastName) as JSON) as author 

为什么会发生,以及如何解决这个问题?

UPD:

我发送如何使用Node.js和快速从服务器的数据:

结果的 console.log
app.get('/posts', (req, res, next) => { 
    getPosts().then((posts) => { 
     res.setHeader('Content-Type', 'application/json'); 
     res.send(posts); 
    }) 
    .catch(next); 
}); 

    // ... 

getPosts() { 
     return new Promise((resolve, reject) => { 
      const query = ` 
      SELECT post.id, post.text, post.datetime, JSON_OBJECT(
       'username', user.username, 
       'firstName', user.firstName, 
       'firstName', user.lastName) as author 
       FROM post 
       INNER JOIN user ON post.authorId = user.id;`; 
      this.connection.query(query, (err, result) => { 
       if(err) { 
        return reject(new Error("An error occured getting the posts: " + err)); 
       } 

       console.log(result) // prints author as a string 

       resolve(result || []); 
      }); 
     }); 
    } 

{ 
    id: 1, 
    text: 'hello, world!', 
    datetime: 2017-05-02T15:08:34.000Z, 
    author: '{"username": "@", "firstName": null}' 
} 

这里我也试图改变res.send(posts)res.json(posts)但这没有帮助。

从客户端我的函数式服务器的帖子:

export const getPosts =() => { 
    customFetch(apiUrl + '/posts') 
    .then(response => response.json()) 
    .then(json => json) 
}; 
+1

大概的东西。这是什么BTW? – e4c5

+0

我使用javascript – rel1x

+0

我不是一个节点专家,但我的理解是,它有多种不同的方式连接到一个RDBMS,可悲的是你所选择的似乎并不支持json对象。 JSON毕竟是一些什么最近除了mysql – e4c5

回答

1

我认为它的罚款为MySQL返回一个字符串,为JSON_OBJECT()功能已经通过产生代表​​以及字符串做的工作格式化的JSON。

您可以在字符串转换成JSON对象的JavaScript与

var obj = JSON.parse(yourString); 

编辑(约JSON和Javascript对象)

首先,如果你不知道,JSON代表JavaScript对象表示法:这意味着它是表示JavaScript对象的文本方式。

从MySQL的角度来看,你已经在SELECT声明中解决了这个问题,因为查询返回的是一个有效的JSON。事实是,那么数据被传输到Javascript(节点),但是对象的Javascript内部表示与其文本表示(JSON)不同;这意味着您必须“投射”它,以便将字符串转换为对象。

为了避免这种转换,你需要的机制需要MySQL知道Javascript代表一个对象,然后用这些知识返回对象的字节码。这就是所谓的序列化,恐怕远远超出了像MySQL这样的dbms的目的。

希望这阐明你的疑惑有点...

+0

我这样做'response => response.json()'。或者你的意思是我必须在我的json中查找每个键,也可以是json,并使用'JSON.parse'呢? – rel1x

+0

是的,整个响应不会是一个有效的JSON,但'作者'字段肯定会。 –

+0

好吧,我从表中获取数据,迭代数据并使用'JSON.parse(post.author)'修改每个作者并将其发送到客户端。现在工作正常,但看起来很奇怪。是否真的没有办法解决'SELECT'中的问题? – rel1x

0

有关返回了整个事情的JSON_OBJECT和做什么JSON。解析上一次

SELECT JSON_OBJECT("id", post.id, "text", post.text, "datetime", post.datetime, "author", JSON_OBJECT(
      'username', user.username, 
      'firstName', user.firstName, 
      'firstName', user.lastName)) 
      FROM post 
      INNER JOIN user ON post.authorId = user.id; 

,消除您的需要循环特定于您所使用的编程语言

相关问题