MySQL查询返回JSON_OBJECT()的结果字符串

时间:2017-05-03 10:40:49

标签: javascript mysql json node.js express

我写了一个查询,它给了我一个表中的帖子,并返回有关每个帖子的作者的信息:

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和Express:

从服务器发送数据
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 || []);
            });
        });
    }

console.log的结果:

{
    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)
};

3 个答案:

答案 0 :(得分:2)

我认为MySQL返回字符串很好,因为JSON_OBJECT()函数已经通过生成表示格式良好的JSON的字符串来完成它的工作。

您可以使用

将该字符串转换为javascript中的JSON对象
var obj = JSON.parse(yourString);

编辑(关于JSON和Javascript对象)

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

从MySQL的角度来看,你已经在SELECT语句中解决了这个问题,因为查询返回的是一个有效的JSON。

事实是,然后数据被传输到Javascript(Node),但是对象的Javascript内部表示与其文本表示(JSON)不同;这意味着你必须“强制转换”它,以便将字符串转换为对象。

为了避免这种转换,你需要的机制需要MySQL知道Javascript如何表示一个对象,然后使用这些知识来返回对象的字节码。这称为序列化,我担心它超出了像MySQL这样的dbms的目的。

希望这能澄清你的疑虑......

答案 1 :(得分:0)

如何将整个事件作为JSON_OBJECT返回并在其上执行JSON.Parse呢

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;

这消除了你需要循环

答案 2 :(得分:0)

数据库配置文件中使用过的JSON typeCast

  connection: {
    ..
    host: process.env.DB_HOST,
    user: process.env.DB_USER,
    ..
    typeCast: function (field, next) {
      if (field.type == 'JSON') {
        return (JSON.parse(field.string())); 
      }
      return next();
    },
    ..
  }