Node.js Synchronous queries with MySQL

前端 未结 6 1971
走了就别回头了
走了就别回头了 2021-01-01 23:23

I\'m working on creating a user registration system for a website that I am working on but I am running into a few issues.

I\'m trying to stay away from having to ne

6条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2021-01-01 23:54

    For most things I code in node.js, I like asynchronous code. However, I completely understand that asynchronous code is extremely and dangerously incompatible with the need to write and maintain business logic. I've used a variety of alternative methods. The modules to make things synchronous still leave you with data scoping issues that complicate things. Promises worked best for me. Using that approach, I found myself practically writing an interpreter for a new language on top of JavaScript. I may seem absurd but the most practical and safest method for me ended up being to use the shelljs module and the mysql shell client. It's not great execution performance but it makes for much better developer performance and keeps business logic clear and orderly, as is crucial for business logic. Here's snippet of code to give an example of some of what I created:

    var shell = require('shelljs');
    
    module.exports = {
        user: '',
        password: '',
    
        runSql: function (sql) {
            var command = "echo '" + sql.replace(/'/g, "'\\''") + "' | mysql -u" + this.user.replace(/'/g, "'\\''") + " -p'" + this.password.replace(/'/g, "'\\''") + "'";
            var raw = shell.exec(command, {silent: true}).stdout;
            //console.log( 'BASH -> MySQL YIELD: "' + raw + '"' );
            if (raw.substr(0, 5) === 'ERROR') {
                console.log('ERROR Resulting from: ' + sql + '\n' + raw);
                return [];
            }
            var rows = raw.split('\n');
            var names = [];
            for (var r = 0; r < rows.length; r += 1) {
                columns = rows[r].split('\t');
    
                // Capture column names
                if (r === 0) {
                    names = columns;
                    continue;
                }
    
                // Reformat row into named valued
                var fields = {};
                for (var c = 0; c < columns.length; c += 1) {
                    fields[names[c]] = columns[c];
                }
                rows[r] = fields;
            }
    
            // Eliminate extraneous first and last rows
            rows.splice(0, 1);
            rows.splice(rows.length - 1, 1);
    
            return rows;
        },
    
    }
    

提交回复
热议问题